JUC之读写锁
-
读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。
读操作可以多个线程,写操作只能一个线程。读写锁可重入的理解:读锁的重入是允许多个申请读操作的线程,而写锁同时只能允许单个线程占有,该线程的写操作可以重入。
如果一个线程占有了写锁,在不释放写锁的情况下,它还能占有读锁,也就是锁的降级。
如果一个线程同时占有了读锁和写锁,在完全释放了写锁,那么就转换为了读锁,以后写操作无法重入,如果写锁未完全释放时,写操作时可以重入的。
Java并发包提供读写锁的实现是 ReentrantReadWriteLock特性:
- 支持公平性和非公平的锁获取方式;
- 支持重进入:写锁可以降级为读锁,但是读锁不能升级为写锁
- 锁降级的定义:锁降级指的是写锁降级成为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不能称之为锁降级。锁降级是指把持住写锁,再获取到读锁,随后释放写锁的过程。
- 写锁可以降级为读锁顺序:首先是获取写锁,第二步是获取读锁;之后是释放写锁,最后一步是释放读锁。但是它的缺点也十分的明显,就是会造成锁饥饿问题 一直读,没有写操作。
&emsp添加锁都是独占,读读、读写、写写都是独占,每次只能一个操作读写锁,读读可以共享,提升性能,同时可以多人进行读操作。
西南地区IT社群(QQ)
- 云南
- 【昆明网页设计交流吧】243627302
- 【昆明nodejs交流吧】 243626749
- 【VUE】838405306
- 【云南程序员总群】343606807
- 【昆明UI设计】104031254
- 【云南软件外包】15547313
- 贵州
- 【PHP/java源码/站长交流群】55692114
- 四川
- 【成都Java/JavaWeb交流】86669225
- 【vaScript+PHP+MySql】116270060
- 【UI设计/设计交流学习群】135794928
- 重庆
- 【诺基亚 JAVA游戏博物馆】 559479780
- 【PHP,Java,Python,C++接单】 442103442
- 西藏