Synchronized是否升级到重量级锁之后就下不来

发布时间:2021-10-18 11:57:43 作者:iii
来源:亿速云 阅读:164

本篇内容主要讲解“Synchronized是否升级到重量级锁之后就下不来”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Synchronized是否升级到重量级锁之后就下不来”吧!

我们直接看锁对象的锁标志来判断。

Synchronized是否升级到重量级锁之后就下不来

直接上实验代码。

Synchronized是否升级到重量级锁之后就下不来

代码非常简单,先看下无锁的对象布局,然后多线程争抢此时应该是重量级锁,然后 sleep 等待所有线程执行完毕释放锁,然后再看看此时的锁布局。

最后再加一次锁看看对象布局。

这里有个注意点

1.8 的偏向锁是会延迟生效的,得在 JVM 启动 4 秒后生效,通过 -XX:BiasedLockingStartupDelay=0关闭偏向锁延迟

这边我没搞这个参数,因为不是重点,所以等下结果里面不会有偏向锁。

上结果!

Synchronized是否升级到重量级锁之后就下不来

结果显而易见,初始是无锁的。

然后4个线程同时竞争变成了重量级锁。

4个线程执行完毕之后,锁对象变成了无锁。

此时再有一个线程去争抢锁,就从无锁变成了轻量级锁。

所以当重量级锁释放了之后,锁对象是无锁的!

有新的线程来竞争的话又会从轻量级锁开始!

好了,over。

最后

想要自己测试的话,引用一个 jol 的包即可

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

代码也直接拷给你们:

`public class YesLockTest {

    static Object yesLock;

    public static void main(String[] args) throws InterruptedException {
        yesLock = new Object();
        System.out.println("无锁时对象布局:" + ClassLayout.parseInstance(yesLock).toPrintable());
        IntStream.rangeClosed(1,4).forEach(i->{getYesLock();});
        Thread.sleep(5000L);
        System.out.println("无竞争之后,此时的对象布局:" + ClassLayout.parseInstance(yesLock).toPrintable());
        getYesLock();//此时再来一次加锁
    }

    private static void getYesLock() {
        new Thread(() -> {
            try {
                synchronized (yesLock) {
                    System.out.println("线程[" + Thread.currentThread().getName() + "]" +
                            ":重量级锁状态对象布局:" + ClassLayout.parseInstance(yesLock).toPrintable());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }

}

到此,相信大家对“Synchronized是否升级到重量级锁之后就下不来”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 死磕Synchronized底层实现--重量级锁
  2. Java synchronized锁如何升级jol

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

synchronized

上一篇:configparser在python3中怎么用

下一篇:如果安装与使用vld查看php的opcode代码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》