美文网首页
13.3.5 偏向锁(gold_axe)

13.3.5 偏向锁(gold_axe)

作者: 胖达_4b7e | 来源:发表于2020-03-27 14:17 被阅读0次

因此, 对象产生以后, 头上就是红框里面这个样子,就是 线程ID没有

顺利 无竞争

首次

有线程试图获得这个对象的锁的时候
使用CAS操作把获取到这个锁的线程的ID记录在对象的MarkWord之中, 就是把绿框内的写进去

解锁


解锁的时候,什么都不要干

下次

这个线程再要得到这个对象的锁, 看到自己这个线程ID已经在里面写着了 ,
虚拟机都可以不再进行任何同步操作(例如加锁、解锁及对Mark Word的更新操作等)
这就是偏向, 得到过的 再得 就可以省了任何动作

竞争

其他线程 也试图得到这个锁, 试图把自己的线程ID写上去, 发现已经有一个线程ID了, 就会撤离偏向,要阻塞到安全点, 检查写这线程ID的线程是否解锁了

如果虽然有写着线程ID, 但是那个线程实际上已经从临界区出去了, 已经解锁了,

那么就撤销偏向, 变成未锁定的头


如果还在锁着,变成 轻量级锁


Hash

可以看到, 可偏向的状态下, 对象是没有地方放hash值的

在Java语言里面一个对象如果计算过哈希码,就应该一直保持该值不变(强烈推荐但不强制,因为用户可以重载hashCode()方法按自己的意愿返回哈希码)
而作为绝大多数对象哈希码来源的Object::hashCode()方法,返回的是对象的一致性哈希码(Identity Hash Code),这个值是能强制保证不变的,它通过在对象头中存储计算结果来保证第一次计算之后,再次调用该方法取到的哈希码值永远不会再发生改变。

因此, 在计算过hash以后, 这个对象 就不能变成 可偏向 了

当一个对象当前正处于偏向锁状态,又收到需要计算其一致性哈希码请求,它的偏向状态会被立即撤销, 并且会变成 重量级锁


代表重量级锁的ObjectMonitor类,可以存储原来的哈希码

相关文章

  • 13.3.5 偏向锁(gold_axe)

    因此, 对象产生以后, 头上就是红框里面这个样子,就是 线程ID没有 顺利 无竞争 首次 有线程试图获得这个对象的...

  • 偏向锁

    HopSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得...

  • 偏向锁

    定义 大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低引入了偏向锁。 ...

  • 偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁

    1. 偏向锁 偏向锁就是在运行过程中,对象的锁偏向某个线程。即在开启偏向锁机制的情况下,某个线程获得锁,当该线程下...

  • 偏向锁、轻量级锁、重量级锁、自旋锁、自适应自旋锁

    1. 偏向锁 偏向锁就是在运行过程中,对象的锁偏向某个线程。即在开启偏向锁机制的情况下,某个线程获得锁,当该线程下...

  • 锁 - 偏向锁、轻量级锁、重量级锁及锁优化

    偏向锁 轻量级锁 重量级锁 锁的状态总共有四种:无锁状态、偏向锁、轻量级锁和重量级锁。 随着锁的竞争,锁可以从偏向...

  • Java虚拟机的锁优化

    JDK内部的优化策略主要包括以下几点 锁偏向 轻量级锁 自旋锁 锁消除 1.锁偏向 锁偏向是一种针对加锁操作的优化...

  • 13.3.5 图像处理类

    13.3.5 图像处理类

  • java 锁升级

    java锁升级路线 偏向锁->轻量级锁->重量级锁(互斥量) 1: 正常无锁状态 轻量级锁未锁定状态 偏向锁未锁...

  • Concurrency-锁升级

    concurrency-锁升级 4种锁状态: 无锁 偏向锁 轻量级锁 重量级锁 无锁 jvm会有4秒的偏向锁开启的...

网友评论

      本文标题:13.3.5 偏向锁(gold_axe)

      本文链接:https://www.haomeiwen.com/subject/zyyluhtx.html