Java锁升级

2019-02-01  本文已影响0人  金泽祺

问题多多,日后再来完善

2019/3/25修改

轻量级锁的加锁过程:发现MarkWord已经偏向其他线程,并且锁还没有释放(持有偏向锁的线程处于同步块?),此时把偏向锁升级成轻量级锁。在线程的栈帧里创建一条锁记录(LockRecord),把MarkWord拷贝进去(DisplayedMarkWord),然后修改MarkWord指向锁记录。接着自旋。如果自旋之后还不能获取锁,则膨胀成重量级锁,即修改MarkWord指向monitor对象(互斥变量?)。

轻量级锁的加锁过程:发现MarkWord已经偏向其他线程,但是锁已经释放,则撤销偏向锁,把MarkWord修改成无锁,接着获取偏向锁。(疑问:偏向锁不能自己解锁?)

轻量级锁的解锁过程:通过CAS操作把MarkWord改写成DisplacedMarkWord,也就是恢复到偏向锁。如果修改失败则说明已经是重量级锁了。

Monitor的同步队列包括:

基础知识

Mark Word

对象头(Object Header)有一部分叫做Mark Word,记录了锁状态

Displaced Mark Word

线程的栈帧(Stack Frame)中有一块空间用于存放锁记录(Lock Record),复制了对象头的Mark Word

CAS(Compare and Swap)

乐观锁机制。先比较再修改


偏向锁升级成轻量级锁

轻量级锁膨胀成重量级锁

上一篇下一篇

猜你喜欢

热点阅读