ReetrantLock 可重入锁 ,基于 AQS (计数 链表队列)

要么不占,要么独占 和 Synchronized  比较像,单更加精细,颗粒化。

区别在于可尝试,等待中断,公平锁,Synchronized  则是 jvm 上 对moniterenter 和moniterexit 指令 计数器 的增减

实际应用场景中,有时候不需要大量竞争的写操作,而是以并发读取为主,为了进一步优化并发操作的粒度,Java 提供了读写锁。

ReadWriteLock  读写锁基于的原理是多个读操作不需要互斥,如果读锁试图锁定时,写锁是被某个线程持有,读锁将无法获得,而只好等待对方操作结束,这样就可以自动保证不会读取到有争议的数据

JDK 在后期引入了 StampedLock,在提供类似读写锁的同时,还支持优化读模式。优化读基于假设,大多数情况下读操作并不会和写操作冲突,其逻辑是先试着修改,然后通过 validate 方法确认是否进入了写模式,如果没有进入,就成功避免了开销;如果进入,则尝试获取读锁。