AQS源碼解析(4)tryAcquire

之前的acquire函數(shù)會先調用tryAcquire去嘗試獲得鎖,這個在每個具體類中實現(xiàn),這里看ReentrantLock中2個實現(xiàn)。
公平鎖FairSync中:

protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {//狀態(tài)為0表示可以加鎖
                if (!hasQueuedPredecessors() && //hasQueuedPredecessors表示之前的線程是否有在排隊的,這里加了!表示沒有排隊
                    compareAndSetState(0, acquires)) { //那么就去嘗試cas state
                    setExclusiveOwnerThread(current); //如果cas成功設置排他線程為當前線程截粗,表示成功得到鎖
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {//如果當前的排他線程是當前線程信姓,表示是重入
                int nextc = c + acquires; //重入計數(shù)器增加
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);//因為已經(jīng)獲得鎖了,所以不用cas去設绸罗,直接設值就行
                return true;
            }
            return false;
        }

非公平鎖中:

protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }

final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {//不同于公平鎖中意推,沒有hasQueuedPredecessors這個函數(shù),表示當非公平鎖去加鎖的時候从诲,不會去看有沒有線程在排隊左痢,直接去搶鎖,如果搶到了后續(xù)一樣系洛。否則會去排隊(后續(xù)代碼再看)
          //之前課程上講過”一朝排隊永遠排隊“就是這個意思俊性,排隊中的非公平并不會去搶先
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市描扯,隨后出現(xiàn)的幾起案子定页,更是在濱河造成了極大的恐慌,老刑警劉巖绽诚,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件典徊,死亡現(xiàn)場離奇詭異,居然都是意外死亡恩够,警方通過查閱死者的電腦和手機卒落,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜂桶,“玉大人儡毕,你說我怎么就攤上這事∑嗣模” “怎么了腰湾?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疆股。 經(jīng)常有香客問我费坊,道長,這世上最難降的妖魔是什么旬痹? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任附井,我火速辦了婚禮,結果婚禮上唱凯,老公的妹妹穿的比我還像新娘羡忘。我一直安慰自己,他們只是感情好磕昼,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著节猿,像睡著了一般票从。 火紅的嫁衣襯著肌膚如雪漫雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天峰鄙,我揣著相機與錄音浸间,去河邊找鬼。 笑死吟榴,一個胖子當著我的面吹牛魁蒜,可吹牛的內容都是我干的。 我是一名探鬼主播吩翻,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼兜看,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狭瞎?” 一聲冷哼從身側響起细移,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熊锭,沒想到半個月后弧轧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡碗殷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年精绎,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌妻。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡代乃,死狀恐怖,靈堂內的尸體忽然破棺而出从祝,到底是詐尸還是另有隱情襟己,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布牍陌,位于F島的核電站擎浴,受9級特大地震影響,放射性物質發(fā)生泄漏毒涧。R本人自食惡果不足惜贮预,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望契讲。 院中可真熱鬧仿吞,春花似錦、人聲如沸捡偏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽银伟。三九已至你虹,卻和暖如春绘搞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傅物。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工夯辖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人董饰。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓蒿褂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卒暂。 傳聞我的和親對象是個殘疾皇子啄栓,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容