国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java知識(shí)學(xué)習(xí)13(AQS詳解)

這篇具有很好參考價(jià)值的文章主要介紹了Java知識(shí)學(xué)習(xí)13(AQS詳解)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、AQS介紹?

AQS 的全稱為 AbstractQueuedSynchronizer ,翻譯過來的意思就是抽象隊(duì)列同步器。這個(gè)類在 java.util.concurrent.locks 包下面。

AQS 就是一個(gè)抽象類,主要用來構(gòu)建鎖和同步器。

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {
}

AQS 為構(gòu)建鎖和同步器提供了一些通用功能的實(shí)現(xiàn),因此,使用 AQS 能簡單且高效地構(gòu)造出應(yīng)用廣泛的大量的同步器,比如我們提到的 ReentrantLock,Semaphore,其他的諸如 ReentrantReadWriteLock,SynchronousQueue等等皆是基于 AQS 的。

2、AQS 原理?

AQS 核心思想AQS 核心思想是: 如果被請(qǐng)求的共享資源空閑,則將當(dāng)前請(qǐng)求資源的線程設(shè)置為有效的工作線程,并且將共享資源設(shè)置為鎖定狀態(tài)。如果被請(qǐng)求的共享資源被占用,那么就需要一套線程阻塞等待以及被喚醒時(shí)鎖分配的機(jī)制,這個(gè)機(jī)制 AQS 是基于 CLH 鎖 (Craig, Landin, and Hagersten locks) 實(shí)現(xiàn)的。

CLH 鎖是對(duì)自旋鎖的一種改進(jìn),是一個(gè)虛擬的雙向隊(duì)列加粗樣式(虛擬的雙向隊(duì)列即不存在隊(duì)列實(shí)例,僅存在結(jié)點(diǎn)之間的關(guān)聯(lián)關(guān)系),暫時(shí)獲取不到鎖的線程將被加入到該隊(duì)列中。AQS 將每條請(qǐng)求共享資源的線程封裝成一個(gè) CLH 隊(duì)列鎖的一個(gè)結(jié)點(diǎn)(Node)來實(shí)現(xiàn)鎖的分配。在 CLH 隊(duì)列鎖中,一個(gè)節(jié)點(diǎn)表示一個(gè)線程,它保存著線程的引用(thread)、 當(dāng)前節(jié)點(diǎn)在隊(duì)列中的狀態(tài)(waitStatus)、前驅(qū)節(jié)點(diǎn)(prev)、后繼節(jié)點(diǎn)(next)。

CLH 隊(duì)列鎖結(jié)構(gòu)如下圖所示:

aqs java,JavaSE,java

AQS(AbstractQueuedSynchronizer)的核心原理圖:
aqs java,JavaSE,java

AQS 使用 int 成員變量 state 表示同步狀態(tài),通過內(nèi)置的 線程等待隊(duì)列 來完成獲取資源線程的排隊(duì)工作。

state 變量由 volatile 修飾,用于展示當(dāng)前臨界資源的獲鎖情況。

// 共享變量,使用volatile修飾保證線程可見性
private volatile int state;

另外,狀態(tài)信息 state 可以通過 protected 類型的getState()、setState()compareAndSetState() 進(jìn)行操作。并且,這幾個(gè)方法都是 final 修飾的,在子類中無法被重寫。

//返回同步狀態(tài)的當(dāng)前值
protected final int getState() {
     return state;
}
 // 設(shè)置同步狀態(tài)的值
protected final void setState(int newState) {
     state = newState;
}
//原子地(CAS操作)將同步狀態(tài)值設(shè)置為給定值update如果當(dāng)前同步狀態(tài)的值等于expect(期望值)
protected final boolean compareAndSetState(int expect, int update) {
      return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}

ReentrantLock 為例,state 初始值為 0,表示未鎖定狀態(tài)。A 線程 lock() 時(shí),會(huì)調(diào)用 tryAcquire() 獨(dú)占該鎖并將 state+1 。此后,其他線程再 tryAcquire() 時(shí)就會(huì)失敗,直到 A 線程 unlock()state=0(即釋放鎖)為止,其它線程才有機(jī)會(huì)獲取該鎖。

當(dāng)然,釋放鎖之前,A 線程自己是可以重復(fù)獲取此鎖的state 會(huì)累加),這就是可重入的概念。但要注意,獲取多少次就要釋放多少次,這樣才能保證 state 是能回到零態(tài)的。

再以 CountDownLatch 以例,任務(wù)分為 N 個(gè)子線程去執(zhí)行,state 也初始化為 N(注意 N 要與線程個(gè)數(shù)一致)。這 N 個(gè)子線程是并行執(zhí)行的,每個(gè)子線程執(zhí)行完后countDown() 一次,state 會(huì) CAS(Compare and Swap) 減 1。等到所有子線程都執(zhí)行完后(即 state=0 ),會(huì) unpark() 主調(diào)用線程,然后主調(diào)用線程就會(huì)從 await() 函數(shù)返回,繼續(xù)后余動(dòng)作。文章來源地址http://www.zghlxwxcb.cn/news/detail-645415.html

到了這里,關(guān)于Java知識(shí)學(xué)習(xí)13(AQS詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java中AQS的原理與實(shí)現(xiàn)

    Java中AQS的原理與實(shí)現(xiàn)

    1:什么是AQS? 2:AQS都有那些用途? 3:我們?nèi)绾问褂肁QS 4:AQS的實(shí)現(xiàn)原理 5:對(duì)AQS的設(shè)計(jì)與實(shí)現(xiàn)的一些思考 ?隨著計(jì)算機(jī)的算力越來越強(qiáng)大,各種各樣的并行編程模型也隨即踴躍而來,但當(dāng)我們要在并行計(jì)算中使用共享資源的時(shí)候,就需要利用一種手段控制對(duì)共享資源的訪問

    2024年02月13日
    瀏覽(27)
  • Java CAS和AQS的實(shí)現(xiàn)原理

    CAS(Compare And Swap)是一種并發(fā)控制機(jī)制,用于解決多線程并發(fā)訪問共享資源時(shí)的數(shù)據(jù)一致性問題。 在Java中,CAS操作通常使用Atomic類來實(shí)現(xiàn)。例如,可以使用java.util.concurrent.atomic.AtomicInteger類來實(shí)現(xiàn)對(duì)整數(shù)類型的原子操作。Atomic類提供了一系列的原子操作方法,例如getAndAdd、

    2024年02月06日
    瀏覽(26)
  • 深入淺出Java多線程(十一):AQS

    深入淺出Java多線程(十一):AQS

    大家好,我是你們的老伙計(jì)秀才!今天帶來的是[深入淺出Java多線程]系列的第十一篇內(nèi)容:AQS( AbstractQueuedSynchronizer )。大家覺得有用請(qǐng)點(diǎn)贊,喜歡請(qǐng)關(guān)注!秀才在此謝過大家了?。?! 在現(xiàn)代多核CPU環(huán)境中,多線程編程已成為提升系統(tǒng)性能和并發(fā)處理能力的關(guān)鍵手段。然而

    2024年03月12日
    瀏覽(30)
  • Java——并發(fā)編程(CAS、Lock和AQS)

    Java——并發(fā)編程(CAS、Lock和AQS)

    答: Lock 接口比同步方法和同步塊提供了 更具擴(kuò)展性的鎖操作 。他們?cè)试S更靈活的結(jié)構(gòu),可以具有完全不同的性質(zhì),并且可以支持多個(gè)相關(guān)類的條件對(duì)象。 可以使鎖更公平; 可以使線程在等待鎖的時(shí)候響應(yīng)中斷; 可以讓線程嘗試獲取鎖,并在無法獲取鎖的時(shí)候立即返回或

    2024年02月06日
    瀏覽(37)
  • 【Java基礎(chǔ)】AQS (AbstractQueuedSynchronizer) 抽象隊(duì)列同步器

    【Java基礎(chǔ)】AQS (AbstractQueuedSynchronizer) 抽象隊(duì)列同步器

    關(guān)于作者:CSDN內(nèi)容合伙人、技術(shù)專家, 從零開始做日活千萬級(jí)APP。 專注于分享各領(lǐng)域原創(chuàng)系列文章 ,擅長java后端、移動(dòng)開發(fā)、人工智能等,希望大家多多支持。 我們繼續(xù)總結(jié)學(xué)習(xí) Java基礎(chǔ)知識(shí) ,溫故知新。 CLH(Craig, Landin, and Hagersten locks)是一種自旋鎖,能確保無饑餓性,提

    2024年02月13日
    瀏覽(22)
  • 深入源碼解析 ReentrantLock、AQS:掌握 Java 并發(fā)編程關(guān)鍵技術(shù)

    深入源碼解析 ReentrantLock、AQS:掌握 Java 并發(fā)編程關(guān)鍵技術(shù)

    ?? 嗨,您好 ?? 我是 vnjohn,在互聯(lián)網(wǎng)企業(yè)擔(dān)任 Java 開發(fā),CSDN 優(yōu)質(zhì)創(chuàng)作者 ?? 推薦專欄:Spring、MySQL、Nacos、Java,后續(xù)其他專欄會(huì)持續(xù)優(yōu)化更新迭代 ??文章所在專欄:JUC ?? 我當(dāng)前正在學(xué)習(xí)微服務(wù)領(lǐng)域、云原生領(lǐng)域、消息中間件等架構(gòu)、原理知識(shí) ?? 向我詢問任何您想要的

    2024年02月11日
    瀏覽(32)
  • 學(xué)Java線程,你不知道什么是AQS?一文帶你了解Java多線程同步的靈魂

    學(xué)Java線程,你不知道什么是AQS?一文帶你了解Java多線程同步的靈魂

    關(guān)于作者:CSDN內(nèi)容合伙人、技術(shù)專家, 從零開始做日活千萬級(jí)APP。 專注于分享各領(lǐng)域原創(chuàng)系列文章 ,擅長java后端、移動(dòng)開發(fā)、人工智能等,希望大家多多支持。 我們繼續(xù)總結(jié)學(xué)習(xí) Java基礎(chǔ)知識(shí) ,溫故知新。 CLH(Craig, Landin, and Hagersten locks)是一種自旋鎖,能確保無饑餓性,提

    2024年02月16日
    瀏覽(22)
  • 學(xué)Java線程,你不知道什么是AQS?一文帶你進(jìn)入Java多線程同步的靈魂-AbstractQueuedSynchronizer

    學(xué)Java線程,你不知道什么是AQS?一文帶你進(jìn)入Java多線程同步的靈魂-AbstractQueuedSynchronizer

    關(guān)于作者:CSDN內(nèi)容合伙人、技術(shù)專家, 從零開始做日活千萬級(jí)APP。 專注于分享各領(lǐng)域原創(chuàng)系列文章 ,擅長java后端、移動(dòng)開發(fā)、人工智能等,希望大家多多支持。 我們繼續(xù)總結(jié)學(xué)習(xí) Java基礎(chǔ)知識(shí) ,溫故知新。 CLH(Craig, Landin, and Hagersten locks)是一種自旋鎖,能確保無饑餓性,提

    2024年02月16日
    瀏覽(25)
  • 如何學(xué)習(xí)Java核心知識(shí)

    Java作為一門廣泛應(yīng)用于軟件開發(fā)的編程語言,擁有著強(qiáng)大的生態(tài)系統(tǒng)和豐富的資源,是值得投入時(shí)間和精力去學(xué)習(xí)的。以下是一些建議,幫助你系統(tǒng)地學(xué)習(xí)Java核心知識(shí)。 學(xué)習(xí)Java語言基礎(chǔ)是學(xué)習(xí)Java的第一步,這是因?yàn)樗鼮楹罄m(xù)的學(xué)習(xí)打下了堅(jiān)實(shí)的基礎(chǔ)。以下是一些詳細(xì)的建

    2024年02月09日
    瀏覽(19)
  • 【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識(shí)清單,Java自學(xué)方向指引

    【Java全棧學(xué)習(xí)路線】最全的Java學(xué)習(xí)路線及知識(shí)清單,Java自學(xué)方向指引

    自學(xué)Java怎么學(xué),找對(duì)方向很關(guān)鍵!在這里為大家分享最全的架構(gòu)師級(jí) Java全棧學(xué)習(xí)路線及知識(shí)清單 ! 包含 JavaSE基礎(chǔ) , JavaWeb , SSM框架 , Linux運(yùn)維 , 分布式與微服務(wù) , 大數(shù)據(jù)開發(fā) ~ 本人研究人生一枚,自學(xué)Java中,后期會(huì)逐步分享清單中所有技術(shù)與知識(shí)的詳細(xì)介紹文章,

    2024年02月03日
    瀏覽(53)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包