Java Synchronised原理
2021-04-21 16:50:24 0 举报
Java Synchronised原理和锁的升级过程
作者其他创作
大纲/内容
执行同步代码块
否
拷贝对象头中的Mark Word到原持有偏向锁线程的锁记录中
开始自选
升级为轻量级锁
重量级锁(标志位 :10)
检查对象头中锁标志位
CAS失败
当前线程的栈桢中创建用于存储锁记录的空间
01(表示无锁或者偏向锁)
失败
原持有偏向锁的线程的栈中创建锁记录空间(LockRcord)
2、唤醒被挂起的线程
原持有偏向锁的线程释放锁空 | (是否是偏向锁)0 | (锁标志位)01
唤醒原持有偏向锁的线程
获取轻量级锁
自选达到一定次数,CAS任然没有成功
线程访问同步代码块
CAS操作成功
暂停持有偏向锁的线程
是
获得偏向锁thread id | epoch | age | 1 | 01
升级重量级锁
开始撤销偏向锁等待竞争出现,才释放锁的机制
未活动状态/已退出了同步代码块
是否是偏向锁
检查原持有偏向锁线程状态
1、升级为重量级锁
再次尝试CAS操作
释放锁
CAS成功
开始轻量级解锁
轻量级锁(标志位:01)
唤醒其它线程,重新竞争(此时锁已经重量级)
CAS操作,将对象头中的Mark Word中的锁记录指针指向当前线程锁记录
竞争锁的其它线程
转为重量级锁指向重量级锁的monitor指针 | (标志位)10
获得轻量级锁原持有偏向锁线程ID | 00
对象头Mark Word
未退出同步块
到达安全点(在这个时间点上没有正在执行的字节码)
拷贝对象头的Mark Word到当前线程分配的锁记录空间
成功
检查MarkWord中记录的线程ID是否是当前线程ID
使用 CAS 操作将 Displaced Mark Word 替换会对象头中
mutex挂起当前线程
CAS 替换MarkWord中的线程ID为当前线程ID
获取轻量级锁指向当前栈的指针 | 00
0 条评论
下一页