代码里循环了三次 , 对象都是一样的!
「节点:在只有一个线程访问代码块的时候,对象中会记录当前线程id 。」
文章插图
「以上都是在一个线程来访问的情况下」
来到序号5,我们新建了一个线程来进行加锁 。此时会判断当前线程id和新线程id是否一致,不一致就会认为有竞争关系,会立刻切换为轻量级锁 。对象头序号为:00
「节点:当有两个线程交替获取锁时,不存在同时竞争获取锁时 。」
文章插图
序号6和7一起说,我们让上面序号5这个线程获取锁后睡眠3s , 持续获得锁 。在开启一个新的线程去竞争获取锁,此时先进行自适应CAS自旋,一般10次后一直没办法获取锁,判定为激烈竞争关系 。变为重量级锁,序号7线程会进行放到阻塞队列中 。对象头序号为:10 。
经过睡眠后,序号6在此获取对象的信息时 , 已经变为重量级锁!
「节点:有两个及其以上线程同时获取锁,且在自适应自旋范围内没有获取到锁」 。
文章插图
下面是代码,大家可以在本地试一下!
/** * jvm默认延时4s自动开启偏向锁, * 可通过 -XX:BiasedLockingStartupDelay=0 * 取消延时如果不要偏向锁,可通过-XX:-UseBiasedLocking = false * @author wangzhenjun * @date 2023/10/18 14:42 */public class LockUp {@SneakyThrowspublic static void mAIn(String[] args) {LockInfo lockInfo = new LockInfo();System.out.println("1.无状态:" + ClassLayout.parseInstance(lockInfo).toPrintable());Thread.sleep(6000);LockInfo lock = new LockInfo();System.out.println("2.已经开启了偏向锁模式:" + ClassLayout.parseInstance(lock).toPrintable());for (int i = 0; i < 3; i++) {synchronized (lock) {System.out.println("3.偏向锁模式下,加锁状态:" + ClassLayout.parseInstance(lock).toPrintable());}System.out.println("4.锁释放了 , 加锁状态:" + ClassLayout.parseInstance(lock).toPrintable());}new Thread(() -> {synchronized (lock) {System.out.println("5.轻量级锁,加锁状态:" + ClassLayout.parseInstance(lock).toPrintable());System.out.println("睡眠3s");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("6.轻量级锁=>重量级锁 , 加锁状态:" + ClassLayout.parseInstance(lock).toPrintable());}}).start();Thread.sleep(1000);new Thread(() -> {synchronized (lock) {System.out.println("重量级锁,加锁状态:" + ClassLayout.parseInstance(lock).toPrintable());}}).start();}}
七、总结与拓展经过实战,我们知道了每一个的切换条件,可以在面试中好好地回答了 。不至于面试官反问一下就不坚定了!关于切换到重量级锁后 , 有兴趣的话,可以下载openJDK源码去看一下关于hotspot/src/share/vm/runtime/objectMonitor.cpp和hotspot/src/share/vm/runtime/objectMonitor.hpp 。
源码下载地址:https://github.com/openjdk/jdk8
objectMonitor.cpp:是 OpenJDK 中实现 Java 同步机制的核心部分,它负责管理对象监视器,确保多线程程序能够正确协同工作,实现线程同步和等待/通知机制 。
文章插图
objectMonitor.hpp:主要用于定义对象监视器的接口和数据结构 , 为实际的对象监视器的实现提供了基础 。
文章插图
推荐阅读
- Java中的泛型,看完这个还不会,我倒立洗头!
- Python 既是解释型语言,也是编译型语言
- 连WiFi要不要关闭数据网络,听听中国移动怎么说
- 一个10年跑步经验的女跑者的忠告:跑步后,这3件事千万不要做
- 苹果手机能咋样下微信,苹果手机不能下载微信了怎么办
- 温和不刺激的护肤品有哪些 十大保湿温和护肤品品牌排行榜
- 怎么用QQ开通微信,为什么用QQ账号还是登录不上微信
- 苹果iPhone电池健康:数值不同,何区别?
- 因长相太美无人敢娶,父亲为她终身不找,她的魅力到底有多大?
- 《跑男》二轮将录,三人缺席,一人回归,三个飞行嘉宾背景不俗