线程安全的实现方法之互斥同步

2020-04-22  本文已影响0人  iamayden

互斥同步(Mutual Exclusion & Synvhronization)

初识Java中最基本的互斥同步手段:synchronized关键字

synchronized实现原理

根据以上行为描述得出直接结论:

sysnchronized弊端

Java 虚拟机对 synchronized 的优化

从Java6开始,虚拟机对synchronized做了多方面的优化,减少“重量级锁”的使用次数,并最终减少线程上下文切换的频率。其中主要做了以下几个优化:锁自旋轻量级锁偏向锁

锁自旋

自旋锁也存在一定的缺陷:自旋锁要占用CPU,如果锁竞争的时间比较长,那么自旋通常不能获得锁,只会白白浪费自旋占用的CPU时间。在锁持有时间长,且竞争激烈的场景中,应当主动禁止自旋锁。

轻量级锁
对于一块同步代码,虽然有多个不同线程会去执行,但是这些线程是在不同的时间段交替请求这把锁对象,也就是不存在锁竞争的情况。在这种情况下,锁会保持在轻量级锁的状态,从而避免重量级锁的阻塞和唤醒操作。

偏向锁

其实偏向锁并不适合所有应用场景,因为一旦出现锁竞争,偏向锁会被撤销,并膨胀成轻量级锁,而撤销操作(revoke)是比较重的行为,只有当存在较多不会真正竞争的synchronized块时,才能体现出明显改善;因此实践中,还是需要考虑具体业务场景,并测试后,再决定是否开启/关闭偏向锁。

阅读笔记以加深印象。

参考:

上一篇 下一篇

猜你喜欢

热点阅读