日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 并发总结——AQS

發(fā)布時(shí)間:2023/12/3 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 并发总结——AQS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、AQS

Java并發(fā)包(JUC)中提供了很多并發(fā)工具,ReentrangLock、Semaphore、CountDownLatch,它們的實(shí)現(xiàn)都用到了一個(gè)共同的基類——AbstractQueuedSynchronizer,簡(jiǎn)稱AQS。

AQS是一個(gè)用來構(gòu)建鎖和同步器的框架,使用AQS能簡(jiǎn)單且高效地構(gòu)造出應(yīng)用廣泛的大量的同步器,比如我們提到的ReentrantLock,Semaphore,其他的諸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等皆是基于AQS的

二、基本實(shí)現(xiàn)原理

AQS維護(hù)一個(gè)共享資源state,通過內(nèi)置的FIFO來完成獲取資源線程的排隊(duì)工作。該隊(duì)列由一個(gè)一個(gè)的Node結(jié)點(diǎn)組成,每個(gè)Node結(jié)點(diǎn)維護(hù)一個(gè)prev引用和next引用,分別指向自己的前驅(qū)和后繼結(jié)點(diǎn),雙端雙向鏈表。

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

狀態(tài)信息通過procted類型的getState,setState,compareAndSetState進(jìn)行操作

三、AQS兩種同步方式

獨(dú)占式、共享式

獨(dú)占式如ReentrantLock

共享式如Semaphore,CountDownLatch,

組合式的如ReentrantReadWriteLock

(1)獨(dú)占式
acquire
a.首先tryAcquire獲取同步狀態(tài),成功則直接返回;否則,進(jìn)入下一環(huán)節(jié);
b.線程獲取同步狀態(tài)失敗,就構(gòu)造一個(gè)結(jié)點(diǎn),加入同步隊(duì)列中,這個(gè)過程要保證線程安全;
c.加入隊(duì)列中的結(jié)點(diǎn)線程進(jìn)入自旋狀態(tài),若是老二結(jié)點(diǎn)(即前驅(qū)結(jié)點(diǎn)為頭結(jié)點(diǎn)),才有機(jī)會(huì)嘗試去獲取同步狀態(tài);否則,當(dāng)其前驅(qū)結(jié)點(diǎn)的狀態(tài)為SIGNAL,線程便可安心休息,進(jìn)入阻塞狀態(tài),直到被中斷或者被前驅(qū)結(jié)點(diǎn)喚醒。
release
release的同步狀態(tài)相對(duì)簡(jiǎn)單,需要找到頭結(jié)點(diǎn)的后繼結(jié)點(diǎn)進(jìn)行喚醒,若后繼結(jié)點(diǎn)為空或處于CANCEL狀態(tài),從后向前遍歷找尋一個(gè)正常的結(jié)點(diǎn),喚醒其對(duì)應(yīng)線程。

(2)共享式
共享式地獲取同步狀態(tài),同步狀態(tài)的方法tryAcquireShared返回值為int。
a.當(dāng)返回值大于0時(shí),表示獲取同步狀態(tài)成功,同時(shí)還有剩余同步狀態(tài)可供其他線程獲取;
b.當(dāng)返回值等于0時(shí),表示獲取同步狀態(tài)成功,但沒有可用同步狀態(tài)了;
c.當(dāng)返回值小于0時(shí),表示獲取同步狀態(tài)失敗。

(3)模板方法模式
 protected boolean tryAcquire(int arg) : 獨(dú)占式獲取同步狀態(tài),試著獲取,成功返回true,反之為false
 protected boolean tryRelease(int arg) :獨(dú)占式釋放同步狀態(tài),等待中的其他線程此時(shí)將有機(jī)會(huì)獲取到同步狀態(tài);
 protected int tryAcquireShared(int arg) :共享式獲取同步狀態(tài),返回值大于等于0,代表獲取成功;反之獲取失敗;
 protected boolean tryReleaseShared(int arg) :共享式釋放同步狀態(tài),成功為true,失敗為false
(5)雙向鏈表Node節(jié)點(diǎn)的狀態(tài)
CANCELLED,值為1,表示當(dāng)前的線程被取消;
SIGNAL,值為-1,表示當(dāng)前節(jié)點(diǎn)的后繼節(jié)點(diǎn)包含的線程需要運(yùn)行,也就是unpark;
CONDITION,值為-2,表示當(dāng)前節(jié)點(diǎn)在等待condition,也就是在condition隊(duì)列中;
PROPAGATE,值為-3,表示當(dāng)前場(chǎng)景下后續(xù)的acquireShared能夠得以執(zhí)行;
值為0,表示當(dāng)前節(jié)點(diǎn)在sync隊(duì)列中,等待著獲取鎖。

(6)AQS實(shí)現(xiàn)公平鎖和非公平鎖
非公平鎖中,那些嘗試獲取鎖且尚未進(jìn)入等待隊(duì)列的線程會(huì)和等待隊(duì)列head結(jié)點(diǎn)的線程發(fā)生競(jìng)爭(zhēng)。

公平鎖中,在獲取鎖時(shí),增加了isFirst(current)判斷,當(dāng)且僅當(dāng),等待隊(duì)列為空或當(dāng)前線程是等待隊(duì)列的頭結(jié)點(diǎn)時(shí),才可嘗試獲取鎖。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Java 并发总结——AQS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。