偏向锁浅析

  偏向锁不像自旋锁、读写锁或者synchronize修饰词这样的同步,它其实是JVM内置的一种锁机制,自JDK1.6后默认启用。换句话说,这种锁不是咱程序员能用代码来瞎操心的,JVM自己会去操心的。真想要瞎操心,就得改JVM的启动参数:

启用参数: 
-XX:+UseBiasedLocking
关闭延迟: -XX:BiasedLockingStartupDelay=0 禁用参数: -XX:-UseBiasedLocking

  既然无需我们操心,那么了解一下也是好的。偏向锁偏向于第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其他的线程获取,那么持有偏向锁的线程无需再进行同步。很明显,当锁的竞争情况很少出现时,偏向锁就能提高性能,因为它比轻量级锁(如自旋锁)少了一步:CAS。

  偏向锁的加锁和解锁有点像可重入锁,它都得先知道取得锁的线程是谁,拿到锁的身份证(线程ID),下次相同的线程来了,啥都别说了,直接走快速通道pass。但如果锁的竞争比较激烈,那么偏向锁并无太大用处。我们来看看,在自旋锁和synchronize同步方法两种情况下,偏向锁的实际时延比较,这里用的是jdk1.8版本。

  一、自旋锁:代码参见自旋锁浅析的testSpinLock方法

  1、默认耗时:

count值:100000, 耗时:25毫秒.

  2、开启偏向锁,启动默认五秒之后生效:-XX:+UseBiasedLocking

count值:100000, 耗时:32毫秒.

  3、开启偏向锁,立即生效:-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0

count值:100000, 耗时:102毫秒.

  4、关闭偏向锁:-XX:-UseBiasedLocking

count值:100000, 耗时:30毫秒.

  我们可以看到,默认时延是最少的,因为JVM会自动优化,而无时延开启偏向锁是最高的,不开启偏向锁和开启但需要5秒启动(这时线程早跑完了,跟不开启差不多)跟默认时延差不多。

  二、synchronize同步方法:代码参见读写锁浅析的TestMyReadWriteLock方法,需要增加全局变量:

private long startTime = 0L;

  在before方法开始处加入该变量的赋值:

startTime = System.currentTimeMillis();

  再加上after方法:

    @After
    public void after()
    {
        System.out.printf("耗时:%d毫秒.\n", System.currentTimeMillis() - startTime);
    }

  1、默认耗时:

耗时:1076毫秒.

  2、开启偏向锁

耗时:1090毫秒.

  3、开启偏向锁,立即生效

耗时:1099毫秒.

   4、关闭偏向锁

耗时:1078毫秒.

   以上对比发现,这偏向锁开不开都差不多。

转载于:https://www.cnblogs.com/wuxun1997/p/10331505.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值