前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java并发-4.锁基础

Java并发-4.锁基础

作者头像
悠扬前奏
发布2019-05-28 12:49:50
2210
发布2019-05-28 12:49:50
举报

0. 四种状态的锁

  • 锁有四种状态:无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态
  • 根据竞争情况升级
  • 锁可以升级不能降级

1. 偏向锁

  • 大多数情况下,锁不存在多线程竞争,且总是由同一线程多次获得
  • 线程访问同步块并获取锁,就在对象头和栈帧中的锁记录里存储偏向锁ID,之后线程出入同步块就不需要CAS来加锁和解锁,只是测试对象头的Mark Word里是否存在指向该线程的偏向锁。测试成功,线程获得锁,失败,就测试Mark Word中锁标识是否是1(当前锁是偏向锁):没有设置,用CAS竞争锁;设置了,用CAS将对象头偏向锁指向当前线程。
  • 偏向锁在出现其他进程尝试竞争的死后才会释放:
    • 在全局安全点(没有正在执行的字节码)执行撤销
    • 持有偏向锁的进程不活动就撤销成无锁状态
    • 进程活着就执行拥有偏向锁的栈。
    • 之后要么恢复到无锁状态,要么标记该对象不适合作为偏向锁
  • 偏向锁默认启用,且在应用起动几秒钟后激活,用-XX:BiasedLockingStartupDelay=0关闭延迟,用-XX:UseBiasedLocking=false关闭偏向锁,关闭后应用进入轻量级锁状态。

2. 轻量级锁

  • 加锁:线程执行同步代码块之前,JVM在该线程栈帧中创建存储锁记录的空间,并将对象MarkDown复制到锁记录中,然后线程尝试用CAS将对象头中的Mark Word替换为指向锁的指针。如果成功,当前线程获得锁;如果失败,标识其他进程获得锁,当前线程尝试自旋来获取锁。
  • 解锁:使用原子的CAS来讲Mark Work替换回到对象头,如果成功,标识没有竞争,如果失败,表示当前锁存在竞争,轻量级锁失效。锁膨胀为重量级锁。

3. 重量级锁

  • 线程竞争不用自旋,不消耗CPU
  • 线程紫色,响应时间就会变慢
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0. 四种状态的锁
  • 1. 偏向锁
  • 2. 轻量级锁
  • 3. 重量级锁
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档