在并发编程中,我们通常会通过synchronized或者ReetrantLock(继承AQS)来进行同步代码块,那作为程序员最好奇的就是它们的底层实现原理是啥呢?
ReetrantLock实现原理
通过代码我们可以知道,ReetrantLock通过的是自旋CAS然后调用Unsafe.park来阻塞线程。
synchronized实现原理
通过源码我们发现Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的,然后通过自旋CAS来尝试把monitor的owner字段设置为当前线程,失败后会调用操作系统的互斥原语mutex来实现阻塞唤醒。
而我们知道Unsafe.park/unpark底层也是调用操作系统的互斥原语mutex来实现阻塞唤醒。这绕来绕去绕到同一个地方了。
注:若调用了互斥原语mutex那么将会触发用户态和内核态的切换,这非常影响性能,所以说synchronized是重量级锁,经过优化的synchronized前面的轻量级锁都只是自旋CAS不阻塞。
具体啥是CAS,啥是监视器,请参考下面的相关资料:
JVM 源码分析(四):深入理解 park / unpark:https://www.daqianduan.com/21245.html
synchronized底层实现原理及锁优化:https://www.cnblogs.com/lixiaochong/p/14425591.html
mutex 互斥:https://blog.csdn.net/qq_39277419/article/details/99295585
理解Monitor监视器锁原理:https://blog.csdn.net/qq_43783527/article/details/114669174