锁的升级过程

偏向锁
HotSpot 的作者 经过 研究 发现 ,大多数情况下, 不存在多 线 争,而且 是由同
线 程多次 得, 让线 的代价更低而引入了偏向 。当一个 线 访问 同步
锁时 ,会在 栈帧 中的 锁记录 里存 储锁 偏向的 线 ID ,以后 该线 程在 入和退出
同步 块时 不需要 CAS 操作来加 和解 ,只需 简单 测试 一下 Mark Word 里是否
着指向当前 线 程的偏向 。如果 测试 成功,表示 线 程已 经获 得了 。如果 测试
要再 测试 一下 Mark Word 中偏向 标识 是否 置成 1 (表示当前是偏向 ):如果没有 置,
使用 CAS ;如果 置了, 则尝试 使用 CAS 的偏向 指向当前 线 程。
1 )偏向 的撤
偏向 使用了一种等到 争出 的机制,所以当其他 线 尝试竞 争偏向 锁时
持有偏向 线 程才会 。偏向 的撤 ,需要等待全局安全点(在 时间 点上没有正
行的字 节码 )。它会首先 有偏向 线 程,然后 检查 持有偏向 线 程是否活着,
如果 线 程不 于活 头设 置成无 ;如果 线 程仍然活着, 有偏向
会被 行,遍 偏向 象的 锁记录 中的 锁记录 Mark Word 要么重新偏向于其他
线 程,要么恢复到无 或者 标记对 象不适合作 偏向 ,最后 停的 线 程。 2-1 中的 线
1 演示了偏向 初始化的流程, 线 2 演示了偏向 的流程。
2 )关 偏向 偏向 Java 6 Java 7 里是默 启用的,但是它在 用程序启 几秒 之后才激活,如 有必要可以使用JVM 参数来关 -XX:BiasedLockingStartupDelay=0 。如果你确定 用程 序里所有的锁 通常情况下 争状 ,可以通 JVM 参数关 偏向 -XX:- UseBiasedLocking=false,那么程序默 级锁

 

轻量级锁
1 级锁
线 程在 行同步 之前, JVM 会先在当前 线 程的 栈桢 建用于存 储锁记录 的空 ,并
中的 Mark Word 复制到 锁记录 中,官方称 Displaced Mark Word 。然后 线 尝试 使用
CAS 中的 Mark Word 换为 指向 锁记录 的指 。如果成功,当前 线 ,如果失
,表示其他 线 ,当前 线 程便 尝试 使用自旋来
2 级锁
锁时 ,会使用原子的 CAS 操作将 Displaced Mark Word 回到 ,如果成
功, 表示没有 生。如果失 ,表示当前 存在 争, 就会膨 成重量 级锁 2-2
两个 线 程同 夺锁 的流程

锁的优缺点对比

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值