目录
参考了这篇文章,围绕这篇文章扩展和整理:
总结:Java中的锁_小魏的博客的博客-CSDN博客_java中的锁
1、synchronized
底层是通过 Monitor 实现的,Monitor 是在 JVM 底层实现的,底层代码是 C++。
synchronized的锁会经历:无锁、偏向锁、轻量级锁(自旋锁)、重量级锁(悲观锁)。
(锁升级过程不可逆)
锁的信息存于对象头,synchronized是否要升级锁,会根据对象头中的锁信息判断。
偏向锁:当没有其他线程竞争(只有一个线程在竞争同步块时), 那么当前锁就是偏向锁;
轻量级锁(自旋锁):当存在多个线程竞争锁, 锁就会从偏向锁升级为轻量级锁;
重量级锁(互斥锁):在升级到轻量级锁后,未抢到锁的线程会自旋等待锁的释放。会消耗CPU资源, 所以Java设置了轻量级锁自旋次数限制 默认10次(通过-XX:PreBlockSpin 设置),当自旋超过10次就会升级为重量级锁。
自旋锁和互斥锁区别
自旋锁:一直占用着CPU,在未获得锁的情况下,一直运行(自旋),性能高,但是废资源,适合等待时间短,并发量不高的情况;
互斥锁:进入内核态的线程阻塞,唤醒时性能低下,适合在等待时间长的情况下使用。
自旋锁的实现
CAS是自旋锁的一种实现方式(CAS是乐观锁的一种实现方式)
CAS有三个操作值:
内存值V、预期值A与修改值B。
根据CAS自己写一个自旋锁:
CAS与自旋锁_皮卡P的博客-CSDN博客_自旋锁和cas的区别
2、Lock
Lock 是接口,实现类有: ReentrantLock,ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock
常用的就是ReentrantLock。
Ree