欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的AQS同步隊列問題詳解

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

AQS 同步隊列

1、AQS 介紹

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

1.1、類圖關系

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

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

1.2、節(jié)點剖析

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

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

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

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

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

2.1、隊列初始化

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

protected AbstractQueuedSynchronizer() {}

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

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

2.2、追加節(jié)點

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

3、AQS 喚醒動作

在進行線程喚醒的過程中,會優(yōu)先喚醒當前持有鎖線程的下一個節(jié)點線程。

  • head 指針指向下一個節(jié)點;
  • 原來頭結(jié)點的 next 指向 null;
  • 當前頭結(jié)點的 prev 指向 null;
  • 當前頭結(jié)點的 thread 指向 null。

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

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

相關文章

  • Maven重復依賴問題解決(同一個jar多個版本)

    Maven重復依賴問題解決(同一個jar多個版本)

    本文主要介紹了Maven重復依賴問題解決(同一個jar多個版本),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 一文帶你熟練掌握Java中的日期時間相關類

    一文帶你熟練掌握Java中的日期時間相關類

    我們在開發(fā)時,除了數(shù)字、數(shù)學這樣的常用API之外,還有日期時間類,更是會被經(jīng)常使用,比如我們項目中必備的日志功能,需要記錄異常等信息產(chǎn)生的時間,本文就帶各位來學習一下相關的日期時間類有哪些
    2023-05-05
  • Java中泛型通配符的使用方法示例

    Java中泛型通配符的使用方法示例

    這篇文章主要介紹了Java中泛型通配符的使用方法,結(jié)合實例形式分析了java中泛型通配符的功能、語法及在泛型類創(chuàng)建泛型對象中的使用方法,需要的朋友可以參考下
    2019-08-08
  • 以Java代碼為例講解設計模式中的簡單工廠模式

    以Java代碼為例講解設計模式中的簡單工廠模式

    簡單來說,工廠模式就是按照需求來返回一個類型的對象,使用工廠模式的意義就是,如果對象的實例化與代碼依賴太大的話,不方便進行擴展和維護,使用工廠的目的就是使對象的實例化與主程序代碼就行解耦.來具體看一下:
    2016-05-05
  • Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例

    Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例

    這篇文章主要為大家介紹了Springboot結(jié)合JDBC實現(xiàn)雙數(shù)據(jù)源實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • java實現(xiàn)桌球小游戲

    java實現(xiàn)桌球小游戲

    這篇文章主要為大家詳細介紹了java實現(xiàn)桌球小游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java實戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng)

    Java實戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng)

    這篇文章主要介紹了Java實戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng),文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Mybatis使用foreach標簽實現(xiàn)批量插入方式

    Mybatis使用foreach標簽實現(xiàn)批量插入方式

    這篇文章主要介紹了Mybatis使用foreach標簽實現(xiàn)批量插入方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • struts2中simple主題下<s:fieldError>標簽默認樣式的移除方法

    struts2中simple主題下<s:fieldError>標簽默認樣式的移除方法

    這篇文章主要給大家介紹了關于struts2中simple主題下<s:fieldError>標簽默認樣式的移除方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-10-10
  • MyBatis中的resultMap簡要概述

    MyBatis中的resultMap簡要概述

    這篇文章主要介紹了MyBatis中的resultMap簡要概述的相關資料,需要的朋友可以參考下
    2016-07-07

最新評論