java object多大 java对象内存模型 数组有多长(七)偏向锁

 https://blog.51cto.com/u_15082395/2590044
深度解析默认 hashCode() 的工作机制
 
biased object是偏向锁定的结果。这个功能获得了专利,自HotSpot 6开始引入,用来降低对象锁定带来的开销。由于具体实现依赖CPU原子指令(CAS),因此对来自不同线程的对象安全地进行锁定和解锁开销很大。据观察,大部分应用程序中,多数对象仅被一个线程锁定,因此采用原子操作是一种浪费。为了避免这种情况,JVM采取偏向锁,即允许线程尝试让对象“偏向”自己。当对象处于已偏向状态,这个幸运的线程可以无需原子指令完成对象锁定与解锁。只要没有线程争用相同的对象,这种方案就可以提高性能。
这样就可以解释FastHashCode实现为什么变得如此复杂。对象头不仅包含了identity hash code,还包含锁定状态,比如指向加锁线程的指针。
这里只是撤销了现有的偏向状态,并禁用对象的偏向锁(false表示“不再尝试为对象设置偏向”)
这意味着获取对象identity hash code将禁用偏向锁,反过来会让锁定对象采用原子指令,进而增大开销。即使只有一个线程也是如此。
 
https://www.zhihu.com/question/52116998
当Java处在偏向锁、重量级锁状态时,hashcode值存储在哪?

这是一个针对HotSpot VM的锁实现的问题。

简单答案是:

  • 当一个对象已经计算过identity hash code,它就无法进入偏向锁状态;
  • 当一个对象当前正处于偏向锁状态,并且需要计算其identity hash code的话,则它的偏向锁会被撤销,并且锁会膨胀为重量锁;
  • 重量锁的实现中,ObjectMonitor类里有字段可以记录非加锁状态下的mark word,其中可以存储identity hash code的值。或者简单说就是重量锁可以存下identity hash code。

https://www.zhihu.com/question/57794716/answer/2302640022
https://blog.csdn.net/P19777/article/details/103125545

posted on 2024-06-18 16:55  silyvin  阅读(2)  评论(0编辑  收藏  举报