synchronized的底层JVM实现机制

Java synchronized 包含两方面的含义

互斥
JVM 通过对象锁来实现互斥:
typedef struct object {
uintptr_t lock;
Class *class;
} Object
协作
协作是通过 Object wait, notify/notifyAll 方法实现的。

对应到JVM 的底层术语,这一机制叫做 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:

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;
}
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值