synchronized是公平锁还是非公平锁

编程入门 行业动态 更新时间:2024-10-07 03:14:56

synchronized是<a href=https://www.elefans.com/category/jswz/34/1754813.html style=公平锁还是非公平锁"/>

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是非公平锁,没有浪费线程唤醒阶段的时间,执行新调用的方法,增加吞吐量,缺点是可能会造成饥饿锁。

更多推荐

synchronized是公平锁还是非公平锁

本文发布于:2024-02-25 07:58:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1698299.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:公平   synchronized

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!