欢迎光临散文网 会员登陆 & 注册

一文带你真正了解偏向锁

2022-07-11 13:47 作者:吃菠菜的太守  | 我要投稿

谈到 java的关键字synchronized,几乎必谈偏向锁,因为原始的synchronized,,大有杀鸡用牛刀的架势。在并发程度不高的情况下,经常被诟病性能不佳。

因此,在juc大行其道之际,jdk开发者也深感脸上挂不住,终于在jdk9引入了偏向锁,并下放到jdk8u。但可惜,迄今为止,市面上对于偏向锁原理,难以找到一个详细的解读,大部分文章也都是抄来抄去,让人有些疑惑始终不得其解。

1.什么情况下会有偏向锁?

2.偏向锁和synchronized其他阶段如何结合?

3.偏向锁为什么会提高低并发下的效率?

4.偏向锁会撤销吗?

当然,第三问,现在就可以给出答案,因为我们在写代码时,尽管用到了synchronized关键字,但只是为了保证代码的并发安全,并不是说这里一定就会并发。对于大多数代码而言,同一时刻实际只会有一个线程在执行,这种时候不应当直接使用代价高的同步模式,而是先尝试做个标记,当真正发生竞争时再考虑同步,至于其他问题,可以看本文。

本文旨在直观展示各种场景下,偏向锁是否会生成,又是否会撤销。关于重偏向,批量撤销等进阶内容,会在synchronized锁粗化的内容中讲解。

本文引用了jol包来输出对象头的二进制情况

关于对象头,还需要以下知识,在64位的虚拟机下,对象头有以下几种状态,需要注意的是,当对象生成时,其处于匿名偏向状态(与偏向状态一样,但线程位置为空)或无锁状态,这取决于你是否开启了偏向锁参数-XX:+UseBiasedLocking(jdk8u默认开启),这两种状态是一个对象头的初始状态。一个容易混淆的地方是,无锁状态是无法升级到偏向锁的,无锁只能升级为轻量级锁。只有初始状态为匿名偏向的,才能升级至偏向锁

不同状态下的对象头



一文带你真正了解偏向锁的评论 (共 条)

分享到微博请遵守国家法律