偏向锁、轻量级锁、重量级锁的实现原理
2022-06-11 22:51:35 1 举报
偏向锁、轻量级锁、重量级锁的实现原理
作者其他创作
大纲/内容
lock锁对象的mark word
BasicLock _displaced_headeroop Thread ID:null biased_lock:0 lock: 01
否
synchronized(lock)
Lock Record 数据结构
BasicObjectLock
CAS失败
CAS成功
触发锁膨胀
执行同步代码块
BasicLock _displaced_headeroop Thread ID:线程1的ID biased_lock:1 lock: 01
未退出同步代码块
CAS更新Mark Word的偏向线程
轻量级锁加锁失败
判断结果
升级到轻量级锁
成功
检查lock锁对象是否可偏向
线程暂停中
达到自旋次数?
是
失败
当前锁对象的状态有可能是无锁、偏向锁、轻量级锁
BasicLock _displaced_headeroop 指向ObjectMonitor地址 lock: 10
当达到全局安全点,阻塞线程1
CAS失败,自旋
已退出同步代码块非存活状态
撤销偏向锁,恢复无锁状态
CAS成功?
分配ObjectMonitor对象并初始化
加入到竞争队列
线程1持有轻量级锁,恢复线程继续执行同步代码块
注意: 自旋是在重量级锁中实现。
为当前线程分配Lock Record
线程2
对象头是否偏向线程2
线程1
当持有重量级锁的线程释放锁之后,唤醒被阻塞的线程
BasicLock _displaced_header->存储lock的mark wordoop 指向线程1中Lock Record的指针 lock: 00
通过park阻塞该线程
升级到重量级锁
CAS把lock的mark word指向 Lock Record
其实就是当前lock锁对象的对象头
CAS更新Mark Word偏向线程2
lock锁对象的mark word且无锁态
把匿名偏向的mark word替换为lock的mark word
获得锁,执行同步代码块
BasicLock _displaced_headeroop Thread ID: null biased_lock:0 lock: 01
构建一个匿名偏向的mark word
ObjectMonitor
检查t1的线程状态
省略左侧相同的步骤...
判断持有对象监视器的线程是否已经释放了锁
构建一个无锁状态的Displaced Mark Word
把lock的Mark Word中轻量级锁的指针指向线程1的 Lock Record
重量级锁的加锁流程
把lock的Mark Word设置到Lock Record中
CAS锁对象头指向ObjectMonitor
撤销偏向锁
尝试获得锁
注意:全局安全点,不需要CAS操作
检查lock的mark word中thread id是否为线程1
0 条评论
下一页