AQS (AbstractQueuedSynchronizer) 概述

有的時候博客內(nèi)容會有變動探膊,首發(fā)博客是最新的捧灰,其他博客地址可能會未同步,認(rèn)準(zhǔn)https://blog.zysicyj.top

全網(wǎng)最細(xì)面試題手冊句伶,支持艾賓浩斯記憶法片仿。這是一份最全面纹安、最詳細(xì)、最高質(zhì)量的 java面試題砂豌,不建議你死記硬背厢岂,只要每天復(fù)習(xí)一遍,有個大概印象就行了阳距。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

AQS (AbstractQueuedSynchronizer) 概述

AQS咪笑,即 AbstractQueuedSynchronizer,是Java并發(fā)包中的一個核心組件娄涩,它為實現(xiàn)依賴于先進先出 (FIFO) 等待隊列的阻塞鎖和相關(guān)的同步器(如信號量、事件等)提供了一個框架映跟。

核心概念

AQS 使用一個整型的 volatile 變量(稱為 state)來表示同步狀態(tài)蓄拣,并通過內(nèi)置的 FIFO 隊列來管理那些阻塞在同步狀態(tài)上的線程。

狀態(tài)(State)

AQS 中的 state 變量是用來表示同步狀態(tài)的努隙。例如球恤,在一個獨占鎖的實現(xiàn)中,state 可能表示鎖的占用情況(0 表示未鎖定荸镊,1 表示鎖定)咽斧。

節(jié)點(Node)和隊列

當(dāng)線程嘗試獲取同步狀態(tài)失敗時,AQS 會將該線程包裝成一個節(jié)點(Node)并將其加入到隊列中躬存。這個隊列是一個雙向鏈表张惹,用于實現(xiàn)等待隊列。

AQS 的主要方法

AQS 定義了一系列的方法岭洲,這些方法可以被同步器實現(xiàn)以提供其獨特的同步邏輯宛逗。

獨占模式

  • boolean tryAcquire(int arg):嘗試獲取資源,成功則返回 true盾剩,失敗則返回 false雷激。
  • boolean tryRelease(int arg):嘗試釋放資源,成功則返回 true告私,失敗則返回 false屎暇。

共享模式

  • int tryAcquireShared(int arg):嘗試獲取資源。返回值大于等于0表示成功驻粟;小于0表示失敗根悼。
  • boolean tryReleaseShared(int arg):嘗試釋放資源,成功則返回 true,失敗則返回 false番挺。

模板方法

  • void acquire(int arg):調(diào)用 tryAcquire唠帝,并在失敗時將線程加入隊列,可能會阻塞玄柏。

  • void release(int arg):調(diào)用 tryRelease 并喚醒等待中的線程襟衰。

  • void acquireShared(int arg):調(diào)用 tryAcquireShared,并在失敗時將線程加入隊列粪摘,可能會阻塞瀑晒。

  • void releaseShared(int arg):調(diào)用 tryReleaseShared 并喚醒等待中的線程。

AQS 的重要性

AQS 的設(shè)計極大地簡化了同步控制的實現(xiàn)徘意,許多并發(fā)工具類都是基于 AQS 構(gòu)建的苔悦,例如:

  • ReentrantLock:一個可重入的互斥鎖。
  • CountDownLatch:一個允許一個或多個線程等待一系列指定操作的完成椎咧。
  • Semaphore:一個計數(shù)信號量玖详。
  • FutureTask:一個可取消的異步計算。

AQS 的使用示例

以下是一個簡化的 AQS 使用示例勤讽,展示了如何實現(xiàn)一個獨占鎖:

class Mutex extends AbstractQueuedSynchronizer {
    // 嘗試獲取鎖
    protected boolean tryAcquire(int acquires) {
        assert acquires == 1; // Otherwise unused
        if (compareAndSetState(0, 1)) {
            setExclusiveOwnerThread(Thread.currentThread());
            return true;
        }
        return false;
    }

    // 嘗試釋放鎖
    protected boolean tryRelease(int releases) {
        assert releases == 1; // Otherwise unused
        if (getState() == 0) throw new IllegalMonitorStateException();
        setExclusiveOwnerThread(null);
        setState(0);
        return true;
    }

    // 是否鎖定狀態(tài)
    public boolean isLocked() {
        return getState() != 0;
    }
}

在這個示例中蟋座,tryAcquire 方法檢查 state 是否為0,如果是脚牍,則嘗試將其設(shè)置為1向臀,如果設(shè)置成功,則表示獲取了鎖诸狭。tryRelease 方法將 state 設(shè)置回0券膀,并清除獨占線程。

AQS 提供的模板方法 acquirerelease 會調(diào)用這些方法驯遇,并在必要時進行線程的排隊和喚醒芹彬。

總結(jié)

AQS 是 Java 并發(fā)編程中的一個重要組件,它通過內(nèi)部的同步狀態(tài)叉庐、等待隊列和模板方法雀监,為構(gòu)建鎖和其他同步器提供了強大的基礎(chǔ)。理解和掌握 AQS 對于深入學(xué)習(xí) Java 并發(fā)編程至關(guān)重要眨唬。

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布会前!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市匾竿,隨后出現(xiàn)的幾起案子瓦宜,更是在濱河造成了極大的恐慌,老刑警劉巖岭妖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件临庇,死亡現(xiàn)場離奇詭異反璃,居然都是意外死亡,警方通過查閱死者的電腦和手機假夺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門淮蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人已卷,你說我怎么就攤上這事梧田。” “怎么了侧蘸?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵裁眯,是天一觀的道長。 經(jīng)常有香客問我讳癌,道長穿稳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任晌坤,我火速辦了婚禮逢艘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骤菠。我一直安慰自己埋虹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布娩怎。 她就那樣靜靜地躺著,像睡著了一般胰柑。 火紅的嫁衣襯著肌膚如雪截亦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天柬讨,我揣著相機與錄音崩瓤,去河邊找鬼。 笑死踩官,一個胖子當(dāng)著我的面吹牛却桶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔗牡,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼颖系,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辩越?” 一聲冷哼從身側(cè)響起嘁扼,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黔攒,沒想到半個月后趁啸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體强缘,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年不傅,在試婚紗的時候發(fā)現(xiàn)自己被綠了旅掂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡访娶,死狀恐怖商虐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情震肮,我是刑警寧澤称龙,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站戳晌,受9級特大地震影響鲫尊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沦偎,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一疫向、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豪嚎,春花似錦搔驼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扔字,卻和暖如春囊嘉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背革为。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工扭粱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人震檩。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓琢蛤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抛虏。 傳聞我的和親對象是個殘疾皇子博其,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

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