首页 > 其他 > 详细

synchronized锁升级的过程

时间:2021-04-16 21:07:09      阅读:28      评论:0      收藏:0      [点我收藏+]

锁状态

  • 无锁
  • 偏向锁
  • 轻量级锁
  • 重量级锁

偏向锁的升级

  1. 当线程1访问代码块并获取锁对象时,会在java对象头和栈帧中记录偏向锁的threadID,偏向锁不会主动释放锁
  2. 当线程2再次获取锁是,比较当前线程的threadID和对象头中的threadID是否一致
  3. 如果一致,则无需加锁、解锁,直接重入
  4. 如果不一致,需要查看对象头中记录的线程1是否存活,如果没有存活,锁对象被重置为无锁态。线程2可以竞争将其设置为偏向锁
  5. 如果存活,立即查找线程1的栈帧信息,如果还需要继续持有这个锁,那么在安全点暂停线程1,撤销偏向锁,升级为轻量级锁
  6. 如果线程1不再使用该锁,设置为无锁态,重新偏向新的线程

轻量级锁的升级

  1. 线程1获取轻量级锁时,会先把锁对象的对象头MarkWord复制一份到线程1的栈帧中创建用于存储锁记录的空间
  2. 使用CAS将对象头中的内容替换为线程1存储的锁记录的地址
  3. 如果线程1在复制对象头的同时,线程2也准备获取锁,复制了对象头到线程2的锁记录空间,在线程2CAS的时候,失败,尝试自旋锁等待线程1释放锁
  4. 自旋次数到了线程1还没有释放锁,或者线程1还在执行,线程2在自旋等待,又有一个线程3竞争锁。轻量级锁就会膨胀到重量级锁。

synchronized锁升级的过程

原文:https://www.cnblogs.com/lll5810/p/14667347.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!