Java中的ReentrantReadWriteLock使用詳解
ReentrantReadWriteLock
ReadWriteLock即讀寫鎖,ReadWriteLock的規(guī)則如下。
a.當(dāng)有線程獲取了Write鎖時(shí),其他線程不能獲取到任何鎖(寫鎖和讀鎖都不能。
b.當(dāng)沒有線程獲取Wrete鎖時(shí),所有線程都可以獲取Read鎖。
c.當(dāng)有Read鎖存在時(shí),獲取不到Write鎖。
1 ReentrantReadWriteLock實(shí)現(xiàn)類繼承關(guān)系
可見該類實(shí)現(xiàn)了ReadWriteLock接口。
2 ReentrantReadWriteLock使用
創(chuàng)建一個(gè)讀寫鎖。
static ReadWriteLock lock = new ReentrantReadWriteLock();
獲取寫鎖。
lock.writeLock().lock();
釋放寫鎖。
lock.writeLock().unlock();
獲取讀鎖。
lock.readLock().lock();
釋放讀鎖。
lock.readLock().unlock();
3 ReentrantReadWriteLock使用實(shí)例
該實(shí)例測試的是上邊的規(guī)則c——當(dāng)有Read鎖存在時(shí),獲取不到Write鎖。
讓一個(gè)線程先獲取到讀鎖并持有5秒鐘。
這是其他線程嘗試去獲取寫鎖,發(fā)現(xiàn)5秒之后其他線程再開始寫入然后在控制臺打印出結(jié)果。
class ReadWriteLockDemo{ static ReadWriteLock lock = new ReentrantReadWriteLock(); static String text = "hello"; public static void modify(){ lock.writeLock().lock(); try { System.err.println(Thread.currentThread().getName()+"開始修改"); text += " "+Thread.currentThread().getName(); }catch (Exception e){ e.printStackTrace(); } finally { lock.writeLock().unlock(); } } public static void readWithReadLock(){ lock.readLock().lock(); try { System.err.println(text); Thread.sleep(5000); System.err.println("5秒過去了"); }catch (Exception e){ }finally { lock.readLock().unlock(); } } public static void main(String[] args) throws InterruptedException { new Thread(()->{ readWithReadLock(); }).start(); Thread.sleep(1000); for (int i=0;i<10;i++) { new Thread(() -> { modify(); }).start(); } } }
使用讀寫鎖時(shí)需要需要明確上述三條規(guī)則。
并且可知,當(dāng)讀很多時(shí),很難寫入,所以讀寫鎖不適用于讀和寫都很多的情況。
到此這篇關(guān)于Java中的ReentrantReadWriteLock使用詳解的文章就介紹到這了,更多相關(guān)ReentrantReadWriteLock使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ IDEA中查看當(dāng)前類的所有繼承關(guān)系圖
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA中查看當(dāng)前類的所有繼承關(guān)系圖,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10Java數(shù)組優(yōu)點(diǎn)和缺點(diǎn)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本文給大家簡單介紹下java數(shù)組的優(yōu)點(diǎn)和缺點(diǎn)知識,需要的的朋友參考下吧2017-04-04java實(shí)現(xiàn)簡易超市管理系統(tǒng) 附源碼下載
這篇文章主要介紹了java實(shí)現(xiàn)簡易超市管理系統(tǒng)(含源碼),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03springcloud-feign調(diào)用報(bào)錯(cuò)問題
這篇文章主要介紹了springcloud-feign調(diào)用報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Mac M1 Java 開發(fā)環(huán)境配置詳解
這篇文章主要介紹了Mac M1 Java 開發(fā)環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03