最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的AQS同步隊(duì)列問題詳解

 更新時(shí)間:2022年06月07日 11:07:01   作者:beordie  
AQS?提供一套基礎(chǔ)的機(jī)制來實(shí)現(xiàn)線程的同步、阻塞與喚醒、等待隊(duì)列等功能,也就是想要深入學(xué)習(xí)線程工具類,這個(gè)同步隊(duì)列就必須得掌握,這篇文章主要介紹了Java中的AQS同步隊(duì)列問題,需要的朋友可以參考下

AQS 同步隊(duì)列

1、AQS 介紹

AQSAbstractQueuedSynchronizer 的縮寫,他是一個(gè)抽象同步類,為 JUC 包下的大多數(shù)同步工具提供了核心實(shí)現(xiàn),例如 ReentrantLock 的底層就是使用同步隊(duì)列。AQS 提供一套基礎(chǔ)的機(jī)制來實(shí)現(xiàn)線程的同步、阻塞與喚醒、等待隊(duì)列等功能,也就是想要深入學(xué)習(xí)線程工具類,這個(gè)同步隊(duì)列就必須得掌握。

1.1、類圖關(guān)系

下面是整個(gè) AQS 的類結(jié)構(gòu)實(shí)現(xiàn)(從源碼中直接打印的圖,平常學(xué)習(xí)源碼也可以這樣打印出來觀察整個(gè)程序的運(yùn)行情況,有助于理解),從圖中我們不難發(fā)現(xiàn) AQS 內(nèi)部持有兩個(gè) Node 類型的 head 、tail 屬性,我們在什么時(shí)候會接觸到頭尾節(jié)點(diǎn)的定義,大家都是有經(jīng)驗(yàn)的開發(fā)人員,肯定都能想到是鏈表當(dāng)中。

在屬性列中我們可以看見一個(gè) state:int 這樣的一個(gè)狀態(tài)字段,Lock 的重入特性就是根據(jù)此來實(shí)現(xiàn)的,可以表示當(dāng)前線程的鎖重入次數(shù)。整個(gè)類繼承自 AbstractOwnableSynchronizer 類,自然擁有對于其父類中屬性的一些控制權(quán),而里面的 Thraed 的線程就是表示當(dāng)前持有鎖的線程,在整個(gè)鎖過程中具有很重要的地位。

1.2、節(jié)點(diǎn)剖析

當(dāng)然鏈表只是一種組織存儲形式的一種數(shù)據(jù)結(jié)構(gòu),這里叫做 FIFO 雙向隊(duì)列,至于為什么是雙向的呢,看一下 Node 的節(jié)點(diǎn)定義就能明白,一個(gè)節(jié)點(diǎn)中含有 prevnext 節(jié)點(diǎn)來快速訪問前驅(qū)和后繼節(jié)點(diǎn),不就是典型的雙向形式呢。

相信大家在看到這個(gè)類字段的屬性名定義之后就能才出來其的作用,但是這里還是介紹一下主要的幾個(gè)字段含義,印證大家的猜想。

屬性作用
thread表示當(dāng)前節(jié)點(diǎn)封裝的具體線程
SHARED表示當(dāng)前線程是獲取共享資源時(shí)被阻塞
EXCLUSIVE表示當(dāng)前線程是獲取獨(dú)占資源時(shí)被掛起
prev當(dāng)前節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)
next當(dāng)前節(jié)點(diǎn)的后繼節(jié)點(diǎn)
waitStatus記錄當(dāng)前線程的等待狀態(tài),其狀態(tài)取值就是下面的四個(gè)字段
CANCELLED取消線程
SIGNAL線程需要被喚醒
CONDITION線程在 condition 中等待
PROPAGATE釋放共享資源時(shí)需要通知其余節(jié)點(diǎn)線程

2、AQS 實(shí)現(xiàn)原理

上面我們知道了 AQS 其實(shí)就是一個(gè)雙向的隊(duì)列,如下圖的結(jié)構(gòu)一樣。在線程獲取鎖失敗的情況下,會被封裝成一個(gè) Node 節(jié)點(diǎn)而插入到隊(duì)列當(dāng)中;當(dāng)其他的線程釋放鎖之后又會從隊(duì)列中喚醒一個(gè)節(jié)點(diǎn)去爭搶鎖。

2.1、隊(duì)列初始化

通過源碼我們可以發(fā)現(xiàn),在 AQS 進(jìn)行初始化的時(shí)候的并沒有對 head 、tail 進(jìn)行初始化,而這兩個(gè)節(jié)點(diǎn)是控制整個(gè)隊(duì)列的,也就是說一開始整個(gè)隊(duì)列處于 null 狀態(tài)。

protected AbstractQueuedSynchronizer() {}

當(dāng)?shù)谝粋€(gè)線程爭搶鎖失敗之后會封裝成 Node 進(jìn)入到同步隊(duì)列當(dāng)中,這個(gè)時(shí)候就會進(jìn)行判斷,如果當(dāng)前隊(duì)列為空就會進(jìn)行初始化(未進(jìn)行初始化),初始化完成之后就將當(dāng)前線程節(jié)點(diǎn)接在隊(duì)列的尾部。

private final void initializeSyncQueue() {
    Node h;
    if (HEAD.compareAndSet(this, (Void)null, h = new Node())) {
        this.tail = h;
    }
}

2.2、追加節(jié)點(diǎn)

追加節(jié)點(diǎn)的操作就是簡單的鏈表尾部添加節(jié)點(diǎn)的過程了,這里就不做過多的贅述。這里來看看前面初始化時(shí)會添加一個(gè)額外的節(jié)點(diǎn)在隊(duì)列中,其實(shí)這個(gè)節(jié)點(diǎn)就是代表當(dāng)前已經(jīng)獲取了鎖的線程,至于為什么這么設(shè)置,大家往后看就明白了。

3、AQS 喚醒動作

在進(jìn)行線程喚醒的過程中,會優(yōu)先喚醒當(dāng)前持有鎖線程的下一個(gè)節(jié)點(diǎn)線程。

  • head 指針指向下一個(gè)節(jié)點(diǎn);
  • 原來頭結(jié)點(diǎn)的 next 指向 null;
  • 當(dāng)前頭結(jié)點(diǎn)的 prev 指向 null;
  • 當(dāng)前頭結(jié)點(diǎn)的 thread 指向 null。

這樣就完成線程的喚醒操作了,但是這樣來講其實(shí)是不完美的,因?yàn)?AQS 只是一個(gè)抽象的統(tǒng)一工具,本身并沒有對業(yè)務(wù)進(jìn)行規(guī)范,還是要結(jié)合具體的實(shí)現(xiàn)類,例如 ReentrantLock 、CountDownLatch 、CyclicBarrier 這些的執(zhí)行過程來進(jìn)行分析。

到此這篇關(guān)于Java中的AQS同步隊(duì)列的文章就介紹到這了,更多相關(guān)java AQS同步隊(duì)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring mvc url匹配禁用后綴訪問操作

    spring mvc url匹配禁用后綴訪問操作

    這篇文章主要介紹了spring mvc url匹配禁用后綴訪問操作,具有很好的參考價(jià)值,希望對大家有所幫助。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家
    2021-07-07
  • springboot aspect通過@annotation進(jìn)行攔截的實(shí)例代碼詳解

    springboot aspect通過@annotation進(jìn)行攔截的實(shí)例代碼詳解

    這篇文章主要介紹了springboot aspect通過@annotation進(jìn)行攔截的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 淺談SpringSecurity重寫默認(rèn)配置

    淺談SpringSecurity重寫默認(rèn)配置

    這篇文章主要介紹了SpringSecurity重寫默認(rèn)配置,包括注入Bean、擴(kuò)展WebSecurityConfigurerAdapter、重寫端點(diǎn)授權(quán)配置及實(shí)現(xiàn)AuthenticationProvider,感興趣的可以了解一下
    2025-01-01
  • Spring5中SpringWebContext方法過時(shí)的解決方案

    Spring5中SpringWebContext方法過時(shí)的解決方案

    這篇文章主要介紹了Spring5中SpringWebContext方法過時(shí)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java8 中的ParallelStream

    Java8 中的ParallelStream

    這篇文章主要介紹了Java8 中的并行流 ParallelStreams,Java8并行流ParallelStream和Stream的區(qū)別就是支持并行執(zhí)行,提高程序運(yùn)行效率。下面就來看看文章內(nèi)容具體介紹吧
    2021-10-10
  • Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對象數(shù)據(jù)合并

    Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對象數(shù)據(jù)合并

    Lambda表達(dá)式,基于Lambda所帶來的函數(shù)式編程,又引入了一個(gè)全新的Stream概念,用于解決集合類庫既有的弊端,Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞進(jìn)方法中)。使用 Lambda 表達(dá)式可以使代碼變的更加簡潔緊湊
    2022-12-12
  • 多模字符串匹配算法原理及Java實(shí)現(xiàn)代碼

    多模字符串匹配算法原理及Java實(shí)現(xiàn)代碼

    這篇文章主要介紹了多模字符串匹配算法原理及Java實(shí)現(xiàn)代碼,涉及算法背景,原理,構(gòu)建過程簡單介紹幾Java代碼實(shí)現(xiàn)等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java中的阻塞隊(duì)列BlockingQueue使用詳解

    Java中的阻塞隊(duì)列BlockingQueue使用詳解

    這篇文章主要介紹了Java中的阻塞隊(duì)列BlockingQueue使用詳解,阻塞隊(duì)列是一種線程安全的數(shù)據(jù)結(jié)構(gòu),用于在多線程環(huán)境下進(jìn)行數(shù)據(jù)交換,它提供了一種阻塞的機(jī)制,當(dāng)隊(duì)列為空時(shí),消費(fèi)者線程將被阻塞,直到隊(duì)列中有數(shù)據(jù)可供消費(fèi),需要的朋友可以參考下
    2023-10-10
  • shiro無狀態(tài)web集成的示例代碼

    shiro無狀態(tài)web集成的示例代碼

    本篇文章主要介紹了shiro無狀態(tài)web集成的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • java基礎(chǔ)之NIO介紹及使用

    java基礎(chǔ)之NIO介紹及使用

    這篇文章主要介紹了java基礎(chǔ)之NIO介紹及使用,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論

澎湖县| 临湘市| 嘉禾县| 招远市| 高雄市| 铜梁县| 昔阳县| 金湖县| 平原县| 布尔津县| 鸡西市| 青河县| 镇康县| 竹山县| 峨眉山市| 邵东县| 江油市| 自治县| 收藏| 罗平县| 聊城市| 阳城县| 新兴县| 平利县| 屯昌县| 七台河市| 永寿县| 同德县| 桑植县| 宁阳县| 铁力市| 江油市| 闸北区| 清新县| 西吉县| 孙吴县| 大田县| 盘山县| 南充市| 左贡县| 通山县|