synchronized偏向锁

目录

1.markWord结构

2. 偏向锁流程

3. 批量重偏向与批量撤销


我们都知道synchronized包含偏向锁,轻量锁,重量锁,其中偏向锁细节上最为复杂,下面简单说明偏向锁。

需要提一下,jdk16不在支持偏向锁,原因是:偏向锁导致synchronization子系统的代码复杂度过高,难以维护、升级。且偏向锁带来的加锁时性能提升从整体上看并没有带来过多收益(撤销锁的成本过高 需要等待全局安全点,再暂停线程做锁撤销)

1.markWord结构

markWord:describes the header of an object

markWord是什么?

它描述了java对象头。准确的说它是对象头中的一部分。

从oopDesc说起,oopDesc在hotspot中是所有对象的基类。_mark属性保存了对象运行时的状态,包括hashcode,age,偏向锁标志,锁标志等。_metadata是描述对象的元数据,可以理解为Class<T>。这样C++就能通过它来获取对象属性和方法等。

class oopDesc {
 private:
  volatile markWord _mark;
  union _metadata {
    Klass*      _klass;
    narrowKlass _compressed_klass;
  } _metadata;
}

 

markWord在不同操作系统中的位描述。

32 bits:
//  --------
//             hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//             JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
64 bits:
//  --------
//  unused:25 hash:31 -->| unused_gap:1   age:4    biased_lock:1 lock:2 (normal object)
//  JavaThread*:54 epoch:2 unused_gap:1   age:4    biased_lock:1 lock:2 (biased object)

markWord初始状态

 
[0 | 0| 0| 1 | 01]       系统环境没有禁用偏向锁
[0 | 0| 0| 0 | 01]       禁用了偏向锁

 

偏向锁状态: 

biased lock pattern:包含两种状态
[JavaThread* | epoch | age | 1 | 01]       偏向某个线程
[0           | epoch | age | 1 | 01]       匿名偏向锁,有两种情况:偏向锁初始状态,或者偏向锁升级为轻量锁产生的短暂的中间状态

 

2. 偏向锁流程

借用别人比较全面的流程图,需要注意到,重偏向很少发生,了解即可。

还有在第一次调用某个对象的Object.hashcode()时,会将哈希值写到markword中,此时无论是偏向锁还是轻量锁都会与hashcode冲突,只能使用重量锁了。重量锁也冲突,但它通过在objectmoniter中记录hashcode值来解决冲突。

3. 批量重偏向与批量撤销

这两种情况比较罕见,可以只做了解。

批量重偏向和批量撤销是针对类的优化,和对象无关。以class为单位维护一个撤销计数器,这个值记录在class的epoch中,每次撤销加1,达到20次时触发批量重偏向,后续该class上的撤销均会重偏向。达到40次时,JVM会标记该class为不可偏向,之后对于该class的锁,直接走轻量级锁的逻辑,表现为该类的新实例对象会被禁用偏向锁,且已有的偏向锁重偏向一次之后不可再次重偏向。

批量重偏向:唯一重偏向场景。当一个线程创建了大量对象并执行了初始的同步操作,后来另一个线程也来将这些对象作为锁对象进行操作,这样会导致大量的偏向锁撤销操作,性能消耗较大。
批量撤销:在明显多线程竞争剧烈的场景下使用偏向锁是不合适的。
借用该文中的偏向锁批量重偏向与批量撤销测试帮助读者们理解 https://www.cnblogs.com/LemonFive/p/11248248.html。自行测试maven引入

<dependency>
     <groupId>org.openjdk.jol</groupId>
     <artifactId>jol-core</artifactId>
     <version>0.15</version>
</dependency>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值