ReentrantReadWriteLock
读写锁定义
读写锁定义为:一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程(读写互斥、读读共享)
锁演化过程

它只允许读读共存,而读写和写写依然是互斥的,大多实际场景是“读/读”线程间并不存在互斥关系,只有”读/写”线程或”写/写”线程间的操作需要互斥的。因此引入ReentrantReadWriteLock。
总结
一个ReentrantReadWriteLock同时只能存在一个写锁但是可以存在多个读锁,但是不能同时存在写锁和读锁,即一个资源可以被多个读操作访问或一个写操作访问,但两者不能同时进行。
只有在读多写少情景之下,读写锁才具有较高的性能体现
锁降级
ReentrantReadWriteLock锁降级:将写入锁降级为读锁(类似Linux文件读写权限理解,就像写权限要高于读权限一样)锁的严苛程度变强叫做升级,反之叫做降级

写锁的降级,降级成为了读锁
1.如果一个线程持有了写锁,在没有释放写锁的情况下,它还可以继续获得读锁,这就是写锁的降级
2.规则惯例,先获取写锁,然后获取读锁,再释放写锁的次序
3.如果释放了写锁,那么就完全转换为读锁

重入还允许通过获取写入锁定,然后读取锁然后释放写锁从写锁到读锁,但是,从读锁升级到写锁是不可能的。


降级总结
如果一个线程占有了写锁,在不释放写锁的情况下,它还能占有读锁(注意这里是同一个线程!!!)
读没有完成的时候无法获得写锁,必须要等着读锁读完后才有机会(不然我刚读的A是1,你写成了A=2,那么就出现了不一致性)
写锁和读锁是互斥的(这里的互斥是指线程间的互斥,当前线程可以获取到写锁又获取到读锁,但是获取到了读锁不能继续获取写锁),这是因为读写锁要保持写操作的可见性。因为,如果允许读锁在被获取的情况下对写锁的获取,那么正在运行的其他读线程无法感知到当前写线程的操作。
ReentrantReadWriteLock
http://example.com/2023/09/05/读写锁/