Synchronized是否升级到重量级锁之后就下不来
本篇内容主要讲解“Synchronized是否升级到重量级锁之后就下不来”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Synchronized是否升级到重量级锁之后就下不来”吧!
在扎鲁特旗等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站设计 网站设计制作按需定制网站,公司网站建设,企业网站建设,品牌网站设计,成都全网营销,成都外贸网站建设公司,扎鲁特旗网站建设费用合理。
我们直接看锁对象的锁标志来判断。
直接上实验代码。
代码非常简单,先看下无锁的对象布局,然后多线程争抢此时应该是重量级锁,然后 sleep 等待所有线程执行完毕释放锁,然后再看看此时的锁布局。
最后再加一次锁看看对象布局。
这里有个注意点
1.8 的偏向锁是会延迟生效的,得在 JVM 启动 4 秒后生效,通过 -XX:BiasedLockingStartupDelay=0关闭偏向锁延迟
这边我没搞这个参数,因为不是重点,所以等下结果里面不会有偏向锁。
上结果!
结果显而易见,初始是无锁的。
然后4个线程同时竞争变成了重量级锁。
4个线程执行完毕之后,锁对象变成了无锁。
此时再有一个线程去争抢锁,就从无锁变成了轻量级锁。
所以当重量级锁释放了之后,锁对象是无锁的!
有新的线程来竞争的话又会从轻量级锁开始!
好了,over。
最后
想要自己测试的话,引用一个 jol 的包即可
代码也直接拷给你们:
`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是否升级到重量级锁之后就下不来”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
分享文章:Synchronized是否升级到重量级锁之后就下不来
转载源于:http://scyanting.com/article/psjsio.html