Java 中 AQS 的幾大經(jīng)典實(shí)現(xiàn)示例詳解
AbstractQueuedSynchronizer(AQS)是Java并發(fā)包(java.util.concurrent.locks)中的一個(gè)核心基礎(chǔ)類,用于構(gòu)建高效、可擴(kuò)展的鎖和同步器。它通過一個(gè)FIFO隊(duì)列管理線程的排隊(duì)和喚醒機(jī)制,簡(jiǎn)化了同步器的開發(fā)。以下是Java中常見的基于AQS的實(shí)現(xiàn)類,每個(gè)實(shí)現(xiàn)都針對(duì)特定場(chǎng)景提供了同步功能。我會(huì)逐一介紹它們的主要用途、特點(diǎn),并提供一個(gè)簡(jiǎn)單的代碼示例。
1.ReentrantLock(可重入鎖)
- 用途:實(shí)現(xiàn)互斥鎖,支持可重入性(同一線程可多次獲取鎖),避免死鎖。常用于替代
synchronized關(guān)鍵字,提供更靈活的鎖控制(如超時(shí)、中斷)。 - 特點(diǎn):基于AQS的獨(dú)占模式(exclusive mode),內(nèi)部維護(hù)一個(gè)狀態(tài)變量記錄鎖的持有次數(shù)。
- 代碼示例:
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private final ReentrantLock lock = new ReentrantLock();
public void safeMethod() {
lock.lock(); // 獲取鎖
try {
// 臨界區(qū)代碼
System.out.println("線程安全操作");
} finally {
lock.unlock(); // 釋放鎖
}
}
}2.ReentrantReadWriteLock(可重入讀寫鎖)
- 用途:實(shí)現(xiàn)讀寫分離的鎖,允許多個(gè)線程同時(shí)讀共享資源,但寫操作時(shí)獨(dú)占鎖。適用于讀多寫少的場(chǎng)景,提升并發(fā)性能。
- 特點(diǎn):基于AQS的共享-獨(dú)占混合模式,內(nèi)部使用兩個(gè)AQS實(shí)例(一個(gè)用于讀鎖,一個(gè)用于寫鎖)。
- 代碼示例:
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockExample {
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private int sharedData = 0;
public void readData() {
rwLock.readLock().lock(); // 獲取讀鎖
try {
System.out.println("讀取數(shù)據(jù): " + sharedData);
} finally {
rwLock.readLock().unlock(); // 釋放讀鎖
}
}
public void writeData(int value) {
rwLock.writeLock().lock(); // 獲取寫鎖
try {
sharedData = value;
System.out.println("寫入數(shù)據(jù): " + value);
} finally {
rwLock.writeLock().unlock(); // 釋放寫鎖
}
}
}3.Semaphore(信號(hào)量)
- 用途:控制對(duì)共享資源的并發(fā)訪問線程數(shù),通過許可證(permits)機(jī)制實(shí)現(xiàn)限流。常用于資源池(如數(shù)據(jù)庫連接池)。
- 特點(diǎn):基于AQS的共享模式(shared mode),狀態(tài)變量表示可用許可證數(shù)量。
代碼示例:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private final Semaphore semaphore = new Semaphore(3); // 允許最多3個(gè)線程同時(shí)訪問
public void accessResource() throws InterruptedException {
semaphore.acquire(); // 獲取許可證
try {
// 訪問共享資源
System.out.println("資源被占用中...");
Thread.sleep(1000); // 模擬操作
} finally {
semaphore.release(); // 釋放許可證
}
}
}4.CountDownLatch(倒計(jì)時(shí)門閂)
- 用途:讓一個(gè)或多個(gè)線程等待其他線程完成操作后繼續(xù)執(zhí)行。常用于初始化任務(wù)或批量處理。
- 特點(diǎn):基于AQS的共享模式,狀態(tài)變量表示倒計(jì)數(shù)值(初始化為正數(shù),遞減到0時(shí)觸發(fā))。
代碼示例:
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3); // 初始化計(jì)數(shù)器為3
for (int i = 0; i < 3; i++) {
new Thread(() -> {
System.out.println("子線程完成任務(wù)");
latch.countDown(); // 計(jì)數(shù)器減1
}).start();
}
latch.await(); // 主線程等待計(jì)數(shù)器歸零
System.out.println("所有任務(wù)完成,主線程繼續(xù)");
}
}5.CyclicBarrier(循環(huán)屏障)
- 用途:讓一組線程相互等待,直到所有線程都到達(dá)某個(gè)屏障點(diǎn)后繼續(xù)執(zhí)行。支持重用,適用于多階段任務(wù)。
- 特點(diǎn):雖然CyclicBarrier不是直接繼承AQS,但內(nèi)部使用ReentrantLock(基于AQS)實(shí)現(xiàn)同步。
代碼示例:
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3, () ->
System.out.println("所有線程到達(dá)屏障,執(zhí)行后續(xù)任務(wù)"));
for (int i = 0; i < 3; i++) {
new Thread(() -> {
try {
System.out.println("線程到達(dá)屏障");
barrier.await(); // 等待其他線程
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
}總結(jié)
以上是Java中常見的基于AQS的實(shí)現(xiàn)類,它們覆蓋了互斥鎖、讀寫鎖、資源控制、線程協(xié)調(diào)等多種并發(fā)場(chǎng)景。使用這些類時(shí),注意線程安全和資源管理,避免死鎖。AQS的設(shè)計(jì)模式(如狀態(tài)變量和隊(duì)列管理)確保了這些實(shí)現(xiàn)的高效性和可擴(kuò)展性。在實(shí)際開發(fā)中,根據(jù)需求選擇合適的同步器,并參考官方文檔(如java.util.concurrent包)獲取更多細(xì)節(jié)。
到此這篇關(guān)于Java 中 AQS 的幾大經(jīng)典實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java aqs內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于Java中靜態(tài)代碼塊的執(zhí)行淺析
這篇文章主要給大家介紹了關(guān)于Java中靜態(tài)代碼塊執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
java遠(yuǎn)程連接調(diào)用Rabbitmq的實(shí)例代碼
本篇文章主要介紹了java遠(yuǎn)程連接調(diào)用Rabbitmq的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
SpringCloud如何搭建一個(gè)多模塊項(xiàng)目
這篇文章主要介紹了SpringCloud如何搭建一個(gè)多模塊項(xiàng)目,記錄下使用SpringCloud創(chuàng)建多模塊項(xiàng)目,一步一步記錄搭建的過程,感興趣的可以了解一下2021-05-05
Java實(shí)現(xiàn)折半插入排序算法的示例代碼
折半插入排序(Binary Insertion Sort)是對(duì)插入排序算法的一種改進(jìn)。不斷的依次將元素插入前面已排好序的序列中。本文將利用Java語言實(shí)現(xiàn)這一排序算法,需要的可以參考一下2022-08-08
SpringCloud使用Nacos作為配置中心統(tǒng)一管理配置方式
文章介紹了如何引入依賴、創(chuàng)建bootstrap.properties文件、添加配置信息、使用注解動(dòng)態(tài)獲取及刷新配置等步驟,以便優(yōu)先從Nacos中獲取配置信息2026-05-05

