ReentrantLock總結(jié)

簡述

ReentrantLock是java中非常重要的一個并發(fā)工具趟妥,相比于java原生的synchronized有著更好的性能

## 概念速查
ReentrantLock涉及的名稱和概念較多仅颇,這里做一個簡單的歸類和解釋冯挎,具體更為詳細(xì)的內(nèi)容,請自行Baidu或Google寥院,這部分用于在閱讀文章的時候掰盘,快速了解一些名稱的概念,如果已經(jīng)熟悉矩肩,請?zhí)^现恼。

快速預(yù)覽

更強(qiáng)大的功能,玩玩意味著更為復(fù)雜的使用,ReentrankLock的使用比起synchronize叉袍,多了一個主動釋放鎖的代碼始锚,一個典型的使用示例如下

ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
    // ... method body
}finally {
    lock.unlock();
}

注意unlock的操作一定要置于finally塊中,這樣才能保證鎖一定能釋放喳逛。

uml圖

看完了簡單的使用示例瞧捌,我們來快速的看一遍ReentrankLock的結(jié)構(gòu),下面是用idea的工具快速生成的uml圖艺配,感謝idea察郁,大大提高了我們的工作質(zhì)量。


ReentrantLock-UML.png

一次性過于深入的討論转唉,往往會迷失在繁瑣的細(xì)節(jié)中皮钠,而難以把握全貌,而細(xì)節(jié)往往是由全局的目標(biāo)決定的赠法,所以我們一層一層的談麦轰,不一次性深入最終代碼。

由uml圖砖织,我們可以看出款侵,ReentrantLock類是一個Lock接口的具體實(shí)現(xiàn),每個ReentrantLock的實(shí)例侧纯,都持有一個sync對象新锈,且這個sync是final修飾的,這個sync有兩種具體的子類眶熬,分別是NonfairSync和FairSync妹笆,也就是非公平鎖和公平鎖。

ReentrantLock有兩個構(gòu)造方法娜氏,我們可以先看這兩個方法拳缠,

public ReentrantLock() {
    sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
    sync = (fair)? new FairSync() : new NonfairSync();
}

可以看出,所謂構(gòu)造函數(shù)贸弥,其實(shí)就是初始化需要使用的sync的類型窟坐,默認(rèn)是非公平鎖。參考公平鎖與非公平鎖

簡要的預(yù)備知識

CAS

ReentrantLock的核心是對CAS方法的使用绵疲,現(xiàn)代的CPU提供了特殊的指令哲鸳,可以自動更新共享數(shù)據(jù),而且能夠檢測到其他線程的干擾盔憨,而 compareAndSet()使用了這些命令帕胆,具體請查閱CAS原理分析

wait

第一層解析

加鎖部分

ReentrantLock的lock其實(shí)就是調(diào)用具體的sync的lock方法。
公平鎖和非公平鎖的加鎖是有所不同的
對于公平鎖來說如下

final void lock() {
    acquire(1);
}

對于非公平鎖來說般渡,是如下的

final void lock() {
  if (compareAndSetState(0, 1))
         setExclusiveOwnerThread(Thread.currentThread()); 
  else        acquire(1);
}

很顯然懒豹,我們可以看出對于公平鎖來說芙盘,非公平鎖多了一個操作。我們首先來解釋一下compareAndSetState方法脸秽,這個方法來自于sync繼承的AbstractQueuedSynchronizer父類儒老。state為0表示當(dāng)前鎖沒有被占用,如果大于0记餐,則表示被持有了驮樊,使用compareAndSetState,底層是個CAS方法片酝,如果鎖沒有被占用囚衔,則置為占用狀態(tài),并且通過setExclusiveOwnerThread雕沿,將當(dāng)前線程設(shè)置為該鎖的持有者练湿。

tryAcquire這個方法的作用,java的官方注釋上如下寫到
Acquires in exclusive mode, ignoring interrupts
大意是"嘗試在獨(dú)占模式下獲取审轮,忽略中斷"肥哎。
截止到目前為止,我們看到的加鎖過程的流程圖如下疾渣,很簡單

ReentrantLock第一層.png
acquire的工作

接下來篡诽,我們研究一下acquire做的工作

public final void acquire(int arg) {
    if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}

tryAcquire,嘗試將鎖的狀態(tài)置為arg榴捡,如果成功杈女,則結(jié)束function,如果失敗吊圾,在CHL隊列中添加一個新的獨(dú)占鎖的節(jié)點(diǎn)碧信,節(jié)點(diǎn)如果添加失敗粒氧,則不做后續(xù)處理歧杏,如果成功則使用selfInterrupt將當(dāng)前線程中斷祸轮。流程圖如下

解鎖部分

我們跳過acquire具體做了什么,我們直接來看unlock做了什么板丽。

public void unlock() {
    sync.release(1);
}
public final boolean release(int arg) {
    if (tryRelease(arg)) {
        Node h = head;        
        if (h != null && h.waitStatus != 0)
            unparkSuccessor(h);
        return true;    
    }    
    return false;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趁尼,隨后出現(xiàn)的幾起案子埃碱,更是在濱河造成了極大的恐慌,老刑警劉巖酥泞,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砚殿,死亡現(xiàn)場離奇詭異,居然都是意外死亡芝囤,警方通過查閱死者的電腦和手機(jī)似炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門辛萍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人羡藐,你說我怎么就攤上這事贩毕。” “怎么了仆嗦?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵辉阶,是天一觀的道長。 經(jīng)常有香客問我瘩扼,道長谆甜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任集绰,我火速辦了婚禮规辱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘倒慧。我一直安慰自己按摘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布纫谅。 她就那樣靜靜地躺著炫贤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪付秕。 梳的紋絲不亂的頭發(fā)上兰珍,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音询吴,去河邊找鬼掠河。 笑死,一個胖子當(dāng)著我的面吹牛猛计,可吹牛的內(nèi)容都是我干的唠摹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奉瘤,長吁一口氣:“原來是場噩夢啊……” “哼勾拉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盗温,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤藕赞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卖局,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斧蜕,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年砚偶,在試婚紗的時候發(fā)現(xiàn)自己被綠了批销。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洒闸。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖风钻,靈堂內(nèi)的尸體忽然破棺而出顷蟀,到底是詐尸還是另有隱情,我是刑警寧澤骡技,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布鸣个,位于F島的核電站,受9級特大地震影響布朦,放射性物質(zhì)發(fā)生泄漏囤萤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一是趴、第九天 我趴在偏房一處隱蔽的房頂上張望涛舍。 院中可真熱鬧,春花似錦唆途、人聲如沸富雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽没佑。三九已至,卻和暖如春温赔,著一層夾襖步出監(jiān)牢的瞬間蛤奢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工陶贼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啤贩,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓拜秧,卻偏偏與公主長得像痹屹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子枉氮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

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

  • 作者: 一字馬胡 轉(zhuǎn)載標(biāo)志 【2017-11-03】 更新日志 前言 在java中志衍,鎖是實(shí)現(xiàn)并發(fā)的關(guān)鍵組件,多個...
    一字馬胡閱讀 44,144評論 1 32
  • 前言 上一篇文章《基于CAS操作的Java非阻塞同步機(jī)制》 分析了非同步阻塞機(jī)制的實(shí)現(xiàn)原理嘲恍,本篇將分析一種以非同步...
    Mars_M閱讀 4,791評論 5 9
  • 博客鏈接:http://www.ideabuffer.cn/2017/03/15/深入理解AbstractQueu...
    閃電是只貓閱讀 6,208評論 5 22
  • 孤獨(dú) 衍生出漠視 漠視 助長了孤獨(dú) 被抽空的世界 生怕誰闖進(jìn)來 溫暖了你 于是關(guān)上門
    尚曉閱讀 233評論 1 3
  • 月已懸掛鉤上樓臺,春風(fēng)對面吹夜已白雄驹。 舟似沉側(cè)畔遙江面佃牛,兩點(diǎn)雪飄飛奈何來。 情字寒凄切對長晚医舆,思念如海水奔月懷俘侠。 ...
    昨夜星辰已泛黃閱讀 196評論 0 2