最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 中 AQS 的幾大經(jīng)典實(shí)現(xiàn)示例詳解

 更新時(shí)間:2025年09月26日 08:58:16   作者:Techie峰  
AQS是Java并發(fā)包中的一個(gè)核心基礎(chǔ)類,用于構(gòu)建高效、可擴(kuò)展的鎖和同步器,以下是Java中常見的基于AQS的實(shí)現(xiàn)類,每個(gè)實(shí)現(xiàn)都針對(duì)特定場(chǎng)景提供了同步功能,我會(huì)逐一介紹它們的主要用途、特點(diǎn),并提供一個(gè)簡(jiǎ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)于Java中靜態(tài)代碼塊執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Java HashMap算法原理詳細(xì)講解

    Java HashMap算法原理詳細(xì)講解

    在java開發(fā)中,HashMap是最常用、最常見的集合容器類之一,文中通過示例代碼介紹HashMap為啥要二次Hash,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • 使用Java和ffmpeg把音頻和視頻合成視頻的操作方法

    使用Java和ffmpeg把音頻和視頻合成視頻的操作方法

    這篇文章主要介紹了使用Java和ffmpeg把音頻和視頻合成視頻,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java遠(yuǎn)程連接調(diào)用Rabbitmq的實(shí)例代碼

    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如何搭建一個(gè)多模塊項(xiàng)目,記錄下使用SpringCloud創(chuàng)建多模塊項(xiàng)目,一步一步記錄搭建的過程,感興趣的可以了解一下
    2021-05-05
  • Java中的關(guān)鍵字之final詳解

    Java中的關(guān)鍵字之final詳解

    這篇文章主要介紹了Java中的關(guān)鍵字之final詳解,final關(guān)鍵字算是個(gè)高頻的java基礎(chǔ)問題了,面試官可能會(huì)問說說final,final修飾的抽象類能夠被繼承嗎等等,下面匯總關(guān)于final關(guān)鍵字的知識(shí)點(diǎn),需要的朋友可以參考下
    2024-01-01
  • Java 合并多個(gè)MP4視頻文件

    Java 合并多個(gè)MP4視頻文件

    這篇文章主要介紹了Java 合并多個(gè)MP4視頻文件的方法,幫助大家利用Java處理視頻,提高辦公效率,感興趣的朋友可以了解下
    2020-11-11
  • Java實(shí)現(xiàn)折半插入排序算法的示例代碼

    Java實(shí)現(xiàn)折半插入排序算法的示例代碼

    折半插入排序(Binary Insertion Sort)是對(duì)插入排序算法的一種改進(jìn)。不斷的依次將元素插入前面已排好序的序列中。本文將利用Java語言實(shí)現(xiàn)這一排序算法,需要的可以參考一下
    2022-08-08
  • java HashMap 的工作原理詳解

    java HashMap 的工作原理詳解

    本文主要介紹java HashMap 的資料,這里整理了相關(guān)資料,并詳細(xì)說明了HashMap的用法,有需要的小伙伴可以參考下
    2016-09-09
  • SpringCloud使用Nacos作為配置中心統(tǒng)一管理配置方式

    SpringCloud使用Nacos作為配置中心統(tǒng)一管理配置方式

    文章介紹了如何引入依賴、創(chuàng)建bootstrap.properties文件、添加配置信息、使用注解動(dòng)態(tài)獲取及刷新配置等步驟,以便優(yōu)先從Nacos中獲取配置信息
    2026-05-05

最新評(píng)論

汨罗市| 鲁山县| 海口市| 枣阳市| 天全县| 滁州市| 深泽县| 固安县| 柯坪县| 化州市| 福安市| 壶关县| 全南县| 永济市| 怀宁县| 麻江县| 西华县| 旺苍县| 瓮安县| 二连浩特市| 凤冈县| 闻喜县| 南和县| 海盐县| 天全县| 茶陵县| 临安市| 九台市| 集贤县| 江川县| 陆丰市| 日照市| 白水县| 淮滨县| 湖北省| 沙河市| 浠水县| 广丰县| 新干县| 姚安县| 鄂尔多斯市|