synchronized的底层JVM实现机制
2017-02-22 17:51
656 查看
Java synchronized 包含两方面的含义
互斥
JVM 通过对象锁来实现互斥:
[cpp] view plain copy print?
typedef struct object { uintptr_t lock; Class *class; } Object
协作是通过 Object wait, notify/notifyAll 方法实现的。
对应到JVM 的底层术语,这一机制叫做 monitor:
[cpp] view plain copy print?
typedef struct monitor { pthread_mutex_t lock; Thread *owner; Object *obj; int count; int in_wait; uintptr_t entering; int wait_count; Thread *wait_set; struct monitor *next; } Monitor;
在不同区域的 Thread 对应的状态(Java Thread 的状态图):
在底层的JVM 或许会有更多的状态,但是,暴露在 Java Thread 的状态是在 java.lang.Thread 中定义的,注意 JDK 6 修订了 interrupt 的语义。
比如,在底层,进行获取 lock 动作到获得 lock 之间有一小段状态叫做 BLOCKED:
[cpp] view plain copy print?
void monitorLock(Monitor *mon, Thread *self) { if(mon->owner == self) mon->count++; else { if(pthread_mutex_trylock(&mon->lock)) { disableSuspend(self); self->blocked_mon = mon; self->blocked_count++; self->state = BLOCKED; pthread_mutex_lock(&mon->lock); self->state = RUNNING; self->blocked_mon = NULL; enableSuspend(self); } mon->owner = self; } }
互斥
JVM 通过对象锁来实现互斥:
[cpp] view plain copy print?
typedef struct object { uintptr_t lock; Class *class; } Object
typedef struct object { uintptr_t lock; Class *class; } Object协作
协作是通过 Object wait, notify/notifyAll 方法实现的。
对应到JVM 的底层术语,这一机制叫做 monitor:
[cpp] view plain copy print?
typedef struct monitor { pthread_mutex_t lock; Thread *owner; Object *obj; int count; int in_wait; uintptr_t entering; int wait_count; Thread *wait_set; struct monitor *next; } Monitor;
typedef struct monitor { pthread_mutex_t lock; Thread *owner; Object *obj; int count; int in_wait; uintptr_t entering; int wait_count; Thread *wait_set; struct monitor *next; } Monitor;
在不同区域的 Thread 对应的状态(Java Thread 的状态图):
在底层的JVM 或许会有更多的状态,但是,暴露在 Java Thread 的状态是在 java.lang.Thread 中定义的,注意 JDK 6 修订了 interrupt 的语义。
比如,在底层,进行获取 lock 动作到获得 lock 之间有一小段状态叫做 BLOCKED:
[cpp] view plain copy print?
void monitorLock(Monitor *mon, Thread *self) { if(mon->owner == self) mon->count++; else { if(pthread_mutex_trylock(&mon->lock)) { disableSuspend(self); self->blocked_mon = mon; self->blocked_count++; self->state = BLOCKED; pthread_mutex_lock(&mon->lock); self->state = RUNNING; self->blocked_mon = NULL; enableSuspend(self); } mon->owner = self; } }
void monitorLock(Monitor *mon, Thread *self) { if(mon->owner == self) mon->count++; else { if(pthread_mutex_trylock(&mon->lock)) { disableSuspend(self); self->blocked_mon = mon; self->blocked_count++; self->state = BLOCKED; pthread_mutex_lock(&mon->lock); self->state = RUNNING; self->blocked_mon = NULL; enableSuspend(self); } mon->owner = self; } }
相关文章推荐
- synchronized的底层JVM实现机制
- synchronized的底层JVM实现机制
- JVM底层是如何实现synchronized---转
- JVM底层是如何实现synchronized的
- synchronized的JVM底层实现(很详细 很底层)
- synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
- synchronized在JVM底层的实现原理及Java多线程锁理解
- synchronized的JVM底层实现
- JVM底层又是如何实现synchronized的
- synchronized在jvm底层是如何实现的
- JVM底层如何实现synchronized
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解 (r)
- JVM底层又是如何实现synchronized的
- JVM底层如何实现synchronized
- JVM底层又是如何实现synchronized的
- JVM底层又是如何实现synchronized的
- synchronized的JVM底层实现
- JVM底层如何实现synchronized
- JVM底层又是如何实现synchronized的
- JVM底层又是如何实现synchronized