synchronized是公平锁还是非公平锁

做再多猜想也不如直接写个案例,验证一下,直接上代码:

public class TestSynchronized {

    public volatile boolean flag;//通知什么时候发起新的请求
    
    //拿住锁5秒钟,以便对后面请求锁进行阻塞
    public synchronized void blockWhile(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    //调用该方法时,会被阻塞住
    public synchronized void blockMethod(){
        if (!this.flag){this.flag = true;}
        System.out.println("block Method : " + System.currentTimeMillis());
    }
    
    //执行新的方法
    public synchronized void newMethod(){
        System.out.println("new Method : " + System.currentTimeMillis());
    }
    
    public static void main(String[] args) throws InterruptedException {
        TestSynchronized testSynchronized = new TestSynchronized();
        
        Thread a = new Thread(testSynchronized::blockWhile);
        
        a.start();
        Thread.sleep(10);//确保a线程获得锁
        
        Thread b = new Thread(() -> {
          for (int i = 0; i < 50;i++){
              testSynchronized.blockMethod();
          } 
        });
        
        b.start();//b线程阻塞50个方法请求
        System.out.println("finish block Method : " + System.currentTimeMillis());
        Thread c = new Thread(() -> {
            int i = 0;
            while (true){
                if (testSynchronized.flag){
                    for ( ; i < 50;i++){
                        testSynchronized.newMethod();
                    }
                }
            }
        });
        c.start();//c线程在b线程的阻塞方法执行后,才执行新的调用方法,模拟新请求方法和阻塞队列请求方法竞争效果
    }
}

执行结果如下,执行结果有很强的随机性,增加执行数量或者增加方法执行次数都能大概率出现如下结果:

finish block Method : 1591683424652
block Method : 1591683429643
block Method : 1591683429643
block Method : 1591683429643
block Method : 1591683429643
new Method : 1591683429643
new Method : 1591683429643
block Method : 1591683429643
block Method : 1591683429643
block Method : 1591683429643
......

说明,synchronized是非公平锁,没有浪费线程唤醒阶段的时间,执行新调用的方法,增加吞吐量,缺点是可能会造成饥饿锁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值