synchronized锁升级机制
2018-07-18 15:43:16 0 举报
synchronized锁升级
作者其他创作
大纲/内容
重置Mark Word为无锁状态0|01
CAS替换Mark Word(还原为dhw)
指向当前线程ID
失败,说明有竞争
N
Y
其他线程在执行膨胀,自旋等待膨胀结束
ObjectMonitor-enter()
撤销偏向锁
膨胀结束
锁膨胀
成功改回0 | 01
自旋直至膨胀完成
Mark Word记录线程ID
执行同步块
轻量级锁
exit()释放锁
Mark Word线程ID为null?
TryLock获取锁CAS设置monitor的owner
释放锁
在当前线程的栈帧分配空间LockRecord锁记录
偏向锁状态
失败,说明有其他线程已经持有偏向锁
可偏向?1|01
重量级锁状态
被唤醒
获取锁成功
自旋等待
更新MarkWord指向monitor地址,并更新monitor字段值
TryLock获取锁
成功
ExitEpilog()唤醒等待线程争夺锁
判断锁当前状态
synchronized结束
轻量级锁00或无锁01
synchronized开始
自旋超时
线程被唤醒,争夺重量级锁monitor
CAS设置Inflating状态
CAS设置monitor的owner
释放锁并唤醒monitor中的某个线程(onDeck | cxq)
CAS更新Mark Word指向锁记录指针
执行完
重入数加一recursions++
多个线程同时进入临界区
多个线程交替进入临界区
获取失败
线程阻塞进入Entry List,等待被唤醒重新争夺锁
monitor竞争
CAS更新Mark Word
进入同步块边界
复制Mark Word到锁记录空间(dhw)
已膨胀10
只有一个线程进入临界区
判断是否重入
自旋等待获取锁
升级成轻量级锁
成功获取monitor
失败
轻量级锁状态
到达全局安全点暂停Mark Word指向的线程
monitor释放
膨胀中Inflating
挂起进入EntryList列表等待唤醒
恢复线程
Mark Word锁标志为00
说明持有锁时,有其他线程争夺并膨胀锁
ObjectMonitor-EnterI()线程封装成ObjectWaiter进入cxq列表自旋获取锁
0 条评论
下一页