AQS

AQS 的全稱是 Abstract Queued Synchronizer,也就是基于隊(duì)列實(shí)現(xiàn)的抽象同步器

AQS 的主要功能

  • 同步狀態(tài)的原子性管理。
  • 線程的阻塞和解除阻塞。
  • 提供阻塞線程的存儲隊(duì)列。

衍生功能

  • 通過中斷實(shí)現(xiàn)的任務(wù)取消俗或,基于線程中斷實(shí)現(xiàn)。
  • 可選的超時設(shè)置扶镀,也就是調(diào)用者可以選擇放棄等待蕴侣。
  • 定義了Condition接口,用于支持管程形式的await/signal/signalAll操作臭觉,代替了Object類基于JNI提供的wait/notify/notifyAll。
AQS還根據(jù)同步狀態(tài)的不同管理方式區(qū)分為兩種不同的實(shí)現(xiàn):獨(dú)占狀態(tài)的同步器和共享狀態(tài)的同步器辱志。

偽代碼:

// acquire操作如下:
while (synchronization state does not allow acquire) {
    enqueue current thread if not already queued;
    possibly block current thread;
}
dequeue current thread if it was queued;

//release操作如下:
update synchronization state;
if (state may permit a blocked thread to acquire){
    unblock one or more queued threads;
}

為了實(shí)現(xiàn)上述操作蝠筑,需要下面三個基本組件的相互協(xié)作:

  • 同步狀態(tài)的原子性管理。
  • 等待隊(duì)列的管理揩懒。
  • 線程的阻塞與解除阻塞什乙。

CLH (Craig, Landin, and Hagersten) locks等待隊(duì)列

CLH鎖也是一種基于鏈表的可擴(kuò)展、高性能已球、公平的自旋鎖臣镣,申請線程僅僅在本地變量上自旋,它不斷輪詢前驅(qū)的狀態(tài)智亮,假設(shè)發(fā)現(xiàn)前驅(qū)釋放了鎖就結(jié)束自旋忆某。從實(shí)現(xiàn)上看,CLH鎖是一種自旋鎖阔蛉,能確保無饑餓性弃舒,提供先來先服務(wù)的公平性。先看簡單的CLH鎖的一個簡單實(shí)現(xiàn):

public class CLHLock implements Lock {

    AtomicReference<QueueNode> tail = new AtomicReference<>(new QueueNode());

    ThreadLocal<QueueNode> pred;
    ThreadLocal<QueueNode> current;

    public CLHLock() {
        current = ThreadLocal.withInitial(QueueNode::new);
        pred = ThreadLocal.withInitial(() -> null);
    }

    @Override
    public void lock() {
        QueueNode node = current.get();
        node.locked = true;
        QueueNode pred = tail.getAndSet(node);
        this.pred.set(pred);
        while (pred.locked) {
        }
    }

    @Override
    public void unlock() {
        QueueNode node = current.get();
        node.locked = false;
        current.set(this.pred.get());
    }

    static class QueueNode {

        boolean locked;
    }

    // 忽略其他接口方法的實(shí)現(xiàn)
}   

但是這個代碼其實(shí)有點(diǎn)問題状原,不停的死循環(huán)會導(dǎo)致cpu過高聋呢,實(shí)際在實(shí)現(xiàn)的時候會采用釋放鎖的時候通知被阻塞線程的方式。

  • todo: 這里還有一些別的優(yōu)化

線程阻塞與喚醒

線程的阻塞和喚醒在JDK1.5之前颠区,一般只能依賴于Object類提供的wait()削锰、notify()和notifyAll()方法,它們都是JNI方法毕莱,由JVM提供實(shí)現(xiàn)器贩,并且它們必須運(yùn)行在獲取監(jiān)視器鎖的代碼塊內(nèi)(synchronized代碼塊中)颅夺,這個局限性先不談性能上的問題,代碼的簡潔性和靈活性是比較低的磨澡。JDK1.5引入了LockSupport類碗啄,底層是基于Unsafe類的park()和unpark()方法,提供了線程阻塞和喚醒的功能稳摄,它的機(jī)制有點(diǎn)像只有一個允許使用資源的信號量java.util.concurrent.Semaphore稚字,也就是一個線程只能通過park()方法阻塞一次,只能調(diào)用unpark()方法解除調(diào)用阻塞一次厦酬,線程就會喚醒(多次調(diào)用unpark()方法也只會喚醒一次)胆描,可以想象是內(nèi)部維護(hù)了一個0-1的計(jì)數(shù)器。

CLH隊(duì)列變體的實(shí)現(xiàn)
獨(dú)占模式與共享模式
Condition的實(shí)現(xiàn)
實(shí)戰(zhàn)篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仗阅,一起剝皮案震驚了整個濱河市昌讲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌减噪,老刑警劉巖短绸,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筹裕,居然都是意外死亡醋闭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門朝卒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來证逻,“玉大人,你說我怎么就攤上這事抗斤∏羝螅” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵瑞眼,是天一觀的道長龙宏。 經(jīng)常有香客問我,道長负拟,這世上最難降的妖魔是什么烦衣? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮掩浙,結(jié)果婚禮上花吟,老公的妹妹穿的比我還像新娘。我一直安慰自己厨姚,他們只是感情好衅澈,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谬墙,像睡著了一般今布。 火紅的嫁衣襯著肌膚如雪经备。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天部默,我揣著相機(jī)與錄音侵蒙,去河邊找鬼。 笑死傅蹂,一個胖子當(dāng)著我的面吹牛纷闺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播份蝴,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼犁功,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婚夫?” 一聲冷哼從身側(cè)響起浸卦,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎案糙,沒想到半個月后限嫌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡时捌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年萤皂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匣椰。...
    茶點(diǎn)故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖端礼,靈堂內(nèi)的尸體忽然破棺而出禽笑,到底是詐尸還是另有隱情,我是刑警寧澤蛤奥,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布佳镜,位于F島的核電站,受9級特大地震影響凡桥,放射性物質(zhì)發(fā)生泄漏蟀伸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一缅刽、第九天 我趴在偏房一處隱蔽的房頂上張望啊掏。 院中可真熱鬧,春花似錦衰猛、人聲如沸迟蜜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娜睛。三九已至髓霞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畦戒,已是汗流浹背方库。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留障斋,地道東北人纵潦。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像配喳,于是被迫代替她去往敵國和親酪穿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評論 2 361