悠扬前奏
Java并发-4.锁基础
关注作者
前往小程序,Get
更优
阅读体验!
立即前往
腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
悠扬前奏
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
社区首页
>
专栏
>
Java并发-4.锁基础
Java并发-4.锁基础
悠扬前奏
关注
发布于 2019-05-28 12:49:50
233
0
发布于 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
删除
前往查看
数据分析
linux
腾讯云测试服务
本文分享自
作者个人站点/博客
前往查看
如有侵权,请联系
cloudcommunity@tencent.com
删除。
本文参与
腾讯云自媒体同步曝光计划
,欢迎热爱写作的你一起参与!
数据分析
linux
腾讯云测试服务
评论
登录
后参与评论
0 条评论
热度
最新
推荐阅读
LV.
文章
0
获赞
0
目录
0. 四种状态的锁
1. 偏向锁
2. 轻量级锁
3. 重量级锁
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档
0
0
0
推荐