ReentrantReadWriteLock了解

Java鎖概念

在講這個(gè)類之前先簡單說一下Java并發(fā)兩個(gè)概念,共享鎖军掂,排他鎖(獨(dú)占鎖)屁魏。共享鎖就可以同時(shí)被多個(gè)線程占有的鎖,即允許多個(gè)線程同時(shí)獲取鎖诊杆,同時(shí)訪問資源歼捐,常見類:CountDownLatch。排他鎖就是在任何時(shí)刻只允許一個(gè)線程能獲取鎖晨汹,其他的線程都在等待獲取豹储,必須等到這個(gè)鎖持有者釋放了,才能獲取到鎖淘这,常見類:ReentrantLock剥扣。

ReentrantReadWriteLock介紹

ReentrantReadWriteLock 是Java的讀寫鎖巩剖,擁有共享鎖和排他鎖的功能,但并不是完全的共享鎖和排他鎖钠怯。通過分離讀寫鎖佳魔,讓多線程可以并發(fā)訪問讀鎖,在訪問寫鎖的時(shí)候晦炊,讀寫互斥鞠鲜,起到保護(hù)數(shù)據(jù)的目的。主要應(yīng)用場景是:當(dāng)很多線程從每個(gè)數(shù)據(jù)結(jié)構(gòu)讀取數(shù)據(jù)断国,而很少有線程對(duì)其進(jìn)行修改時(shí)镊尺,在這種情況下,允許讀取線程共享訪問你是合適的并思,寫入器線程依然是互斥庐氮。

ReentrantReadWriteLock 主要特性

公平性

支持公平鎖和非公平鎖,默認(rèn)是非公平鎖宋彼,可以根據(jù)構(gòu)造方式設(shè)置公平鎖弄砍。

  ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(true);//默認(rèn)是false 非公平鎖

由于讀線程之間沒有鎖競爭,所以讀操作输涕,沒有公平性和非公平性音婶。寫操作時(shí)可能立即獲取到鎖,所以會(huì)推遲一個(gè)或者多個(gè)讀操作或者寫操作莱坎,非公平鎖的吞吐量要高于公平鎖衣式。

重入性

讀寫鎖允許讀線程和寫線程按照請(qǐng)求鎖的順序重新獲取讀取鎖或者寫入鎖,但是只有寫線程釋放了鎖檐什,讀線程才能獲取重入鎖碴卧。寫線程獲取寫入鎖以后可以再次獲取讀鎖,但是讀線程獲取讀鎖后不能獲取寫入鎖乃正。讀寫鎖最多支持65535個(gè)遞歸寫入鎖和65535個(gè)遞歸讀取鎖住册。

鎖降級(jí)

寫線程獲取鎖后,可以獲取讀線程瓮具,然后再釋放寫鎖荧飞,這樣就從寫鎖變成讀鎖,實(shí)現(xiàn)了鎖降級(jí)名党。

鎖升級(jí)

讀線程獲取鎖后叹阔,并不知直接獲取寫鎖,獲取一個(gè)寫入鎖需要釋放所有讀取鎖传睹。從讀取鎖升級(jí)到寫入鎖耳幢,這個(gè)過程被稱作鎖升級(jí),這個(gè)過程必須讀取鎖釋放了鎖蒋歌,在重新獲取到寫入鎖帅掘,才能稱作鎖升級(jí)委煤。

鎖獲取中斷

讀取鎖和寫入鎖都支持在獲取鎖期間被中斷。

概括起來其實(shí)就是讀寫鎖的機(jī)制

讀讀不互斥修档,即使當(dāng)前有100個(gè)線程同時(shí)讀取資源碧绞,沒有線程寫入,這個(gè)100個(gè)線程是可以并發(fā)訪問吱窝。
讀寫互斥讥邻,比如說當(dāng)前有線程在寫,當(dāng)線程想獲取讀入鎖的時(shí)候院峡,會(huì)被堵塞兴使,反過來,有線程已經(jīng)獲取讀入鎖的時(shí)候照激,寫的線程也會(huì)堵塞发魄,就看誰先拿到鎖。
寫寫互斥比如有兩個(gè)線程A俩垃,B励幼,A線程先拿到鎖,B線程就會(huì)堵塞到A釋放鎖為止口柳。
使用ReentrantReadWriteLock讀取緩存例子

 private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
    
    private final Map<String,Object> map = new HashMap<>(); //假設(shè)這存著數(shù)據(jù)緩存
    
    public Object readwrite(String id) {
        Object val = null;
        rwLock.readLock().lock(); //首先開啟讀取鎖苹粟,從緩存中去讀取
        try {
            val = map.get(id);
            if(val == null) {//假如緩存中沒有這個(gè)值,可以從數(shù)據(jù)庫讀取這個(gè)值跃闹,然后寫入到緩存中
                rwLock.readLock().unlock();//這里用到的鎖升級(jí)嵌削,先釋放,在獲取
                rwLock.writeLock().lock();
                try {
                    //這里是從數(shù)據(jù)庫獲取數(shù)據(jù)
                    val = "aaa";
                }finally {
                    rwLock.writeLock().unlock();//釋放寫入鎖望艺,讓緩存可以并發(fā)訪問
                }
                rwLock.readLock().lock();
            }
        }finally {
            rwLock.readLock().unlock();//兩次讀取鎖苛秕,保證釋放鎖,一定都在finally中可以釋放
        }
        return val;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荣茫,一起剝皮案震驚了整個(gè)濱河市想帅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啡莉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旨剥,死亡現(xiàn)場離奇詭異咧欣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)轨帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門魄咕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚌父,你說我怎么就攤上這事哮兰∶龋” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵喝滞,是天一觀的道長阁将。 經(jīng)常有香客問我,道長右遭,這世上最難降的妖魔是什么做盅? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮窘哈,結(jié)果婚禮上吹榴,老公的妹妹穿的比我還像新娘。我一直安慰自己滚婉,他們只是感情好图筹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著让腹,像睡著了一般婿斥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哨鸭,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天民宿,我揣著相機(jī)與錄音,去河邊找鬼像鸡。 笑死活鹰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的只估。 我是一名探鬼主播志群,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蛔钙!你這毒婦竟也來了锌云?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤吁脱,失蹤者是張志新(化名)和其女友劉穎桑涎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兼贡,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攻冷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遍希。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片等曼。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禁谦,到底是詐尸還是另有隱情胁黑,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布州泊,位于F島的核電站丧蘸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拥诡。R本人自食惡果不足惜触趴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渴肉。 院中可真熱鬧冗懦,春花似錦、人聲如沸仇祭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乌奇。三九已至没讲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間礁苗,已是汗流浹背爬凑。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留试伙,地道東北人嘁信。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像疏叨,于是被迫代替她去往敵國和親潘靖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • ReadWriteLock 從這一節(jié)開始介紹鎖里面的最后一個(gè)工具:讀寫鎖(ReadWriteLock)蚤蔓。 Reen...
    raincoffee閱讀 637評(píng)論 0 1
  • 一卦溢、前言 借用Java并發(fā)編程實(shí)踐中的話"編寫正確的程序并不容易,而編寫正常的并發(fā)程序就更難了"秀又,相比于順序執(zhí)行的...
    運(yùn)維開發(fā)筆記閱讀 329評(píng)論 0 2
  • Nginx + Apache 反向代理 反向代理負(fù)載均衡 使用代理服務(wù)器可以將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部的Web服務(wù)器单寂,使用這...
    食屎啦你_91ad閱讀 602評(píng)論 0 1
  • 難眠的夜 失聲的淚 一切美好被時(shí)光吞沒 那時(shí)的你青澀稚嫩 如今的你人老珠黃 我站在橋的這頭 思念著對(duì)面的你 多少次...
    紅豆薏米綠豆閱讀 136評(píng)論 0 3