有的時候博客內(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 提供的模板方法 acquire
和 release
會調(diào)用這些方法驯遇,并在必要時進行線程的排隊和喚醒芹彬。
總結(jié)
AQS 是 Java 并發(fā)編程中的一個重要組件,它通過內(nèi)部的同步狀態(tài)叉庐、等待隊列和模板方法雀监,為構(gòu)建鎖和其他同步器提供了強大的基礎(chǔ)。理解和掌握 AQS 對于深入學(xué)習(xí) Java 并發(fā)編程至關(guān)重要眨唬。
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布会前!