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

Java并發(fā)編程之CountDownLatch原理詳解

 更新時間:2023年12月11日 08:48:16   作者:程光CS  
這篇文章主要介紹了Java并發(fā)編程之CountDownLatch原理詳解,CountDownLatch類中使用了一個繼承自AQS的共享鎖Sync對象,構造CountDownLatch對象時會將傳入的線程數(shù)值設為AQS的state值,需要的朋友可以參考下

一、CountDownLatch介紹

在日常開發(fā)中經(jīng)常會遇到需要在主線程中開啟多個線程去并行執(zhí)行任務,并且主線程需要等待所有子線程執(zhí)行完畢后再進行匯總的場景。

在 CountDownLatch 出現(xiàn)之前一般都使用線程的join()方法來實現(xiàn)這一點,但是 join 方法不夠靈活,不能夠滿足不同場景的需要,所以JDK開發(fā)組提供了 CountDownLatch 這個類,使用CountDownLatch 會更優(yōu)雅。

并且CountDownLatch 可以在子線程的任何位置讓 await 方法返回而不一定必須線程結束,這比join更加靈活。使用 CountDownLatch 的代碼如下:

public static void main(String[] args) throws InterruptedException {
    //內部sync同步器的state值設為3
    CountDownLatch countDownLatch = new CountDownLatch(3);

    for (int i = 1;i <= 3;i++) {
        new Thread(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println("目標代碼塊運行完畢");
                //每調用一次countDown()內部調用releaseShared(1)都會使state值減一
                countDownLatch.countDown();
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("線程結束");
        }).start();
    }
    System.out.println("所有線程已啟動");
    //主線程調用await()方法后就會進入阻塞,直到所有線程調用了countDown()使state值被減為0,或者主線程被中斷,才會從阻塞返回
    countDownLatch.await();
    System.out.println("所有線程目標代碼塊已運行完畢");
}

二、CountDownLatch原理

CountDownLatch類中使用了一個繼承自AQS的共享鎖Sync對象,構造CountDownLatch對象時會將傳入的線程數(shù)值設為AQS的state值

當一個線程結束運行調用countDown()方法時,內部調用releaseShared(1)時調用Sync中重寫的鉤子方法tryReleaseShared()都會使state值減一,當被state被減為0后tryReleaseShared才會返回true,繼而調用doReleaseShared喚醒同步隊列中被阻塞的線程

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

主線程調用await()方法后就會進入阻塞,其內部調用的acquireSharedInterruptibly方法,只有當鉤子方法tryAcquireShared返回值>=0時才能拿到鎖,而Sync中重寫的tryAcquireShared只有當state為0才會返回1,否則返回-1,因此只有到最后一個線程調用了countDown()使state值被減為0繼而喚醒同步隊列中阻塞的主線程,或者主線程被中斷,才會從阻塞返回。

到此這篇關于Java并發(fā)編程之CountDownLatch原理詳解的文章就介紹到這了,更多相關CountDownLatch原理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)從網(wǎng)上下載圖片到本地的方法

    java實現(xiàn)從網(wǎng)上下載圖片到本地的方法

    這篇文章主要介紹了java實現(xiàn)從網(wǎng)上下載圖片到本地的方法,涉及java針對文件操作的相關技巧,非常簡單實用,需要的朋友可以參考下
    2015-07-07
  • HashMap實現(xiàn)保存兩個key相同的數(shù)據(jù)

    HashMap實現(xiàn)保存兩個key相同的數(shù)據(jù)

    這篇文章主要介紹了HashMap實現(xiàn)保存兩個key相同的數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring?Boot實現(xiàn)分布式系統(tǒng)中的服務發(fā)現(xiàn)和注冊(最新推薦)

    Spring?Boot實現(xiàn)分布式系統(tǒng)中的服務發(fā)現(xiàn)和注冊(最新推薦)

    在本文中,我們深入探討了Spring?Boot如何實現(xiàn)分布式系統(tǒng)中的服務發(fā)現(xiàn)和注冊,我們使用Eureka作為服務注冊中心,Ribbon作為負載均衡器,Hystrix作為熔斷器,成功地實現(xiàn)了服務發(fā)現(xiàn)、服務注冊、負載均衡和服務熔斷等功能,需要的朋友參考下吧
    2023-06-06
  • Java集合和數(shù)組的區(qū)別

    Java集合和數(shù)組的區(qū)別

    本文主要介紹了Java集合和數(shù)組的區(qū)別。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java?Guava異步編程實踐

    Java?Guava異步編程實踐

    今天咱們要聊的是Guava在異步編程中的應用,讓我們搞清楚為什么要用Guava來處理異步任務,在Java的世界里,異步編程是個老話題了,但它依舊非常關鍵,它能讓咱們的應用更高效,尤其是在處理那些耗時的I/O操作
    2023-12-12
  • 全面解讀Java?NIO(看這篇就夠了)

    全面解讀Java?NIO(看這篇就夠了)

    Java?NIO是Java1.4之后推出來的一套IO接口,NIO提供了一種完全不同的操作方式,?NIO支持面向緩沖區(qū)的、基于通道的IO操作,這篇文章主要介紹了Java?NIO詳解(看這篇就夠了),需要的朋友可以參考下
    2023-05-05
  • Java中List轉Map List實現(xiàn)的幾種姿勢

    Java中List轉Map List實現(xiàn)的幾種姿勢

    本文主要介紹了Java中List轉Map List實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • XML解析四種方式代碼示例詳解

    XML解析四種方式代碼示例詳解

    這篇文章主要介紹了XML解析四種方式代碼示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • java 交換兩個數(shù)據(jù)的方法實例詳解

    java 交換兩個數(shù)據(jù)的方法實例詳解

    這篇文章主要介紹了java 交換兩個數(shù)據(jù)的方法實例詳解的相關資料,需要的朋友可以參考下
    2016-12-12
  • Java實現(xiàn)郵箱發(fā)送功能實例(阿里云郵箱推送)

    Java實現(xiàn)郵箱發(fā)送功能實例(阿里云郵箱推送)

    這篇文章主要給大家介紹了關于Java實現(xiàn)郵箱發(fā)送功能的相關資料,利用阿里云郵箱推送,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09

最新評論

阳西县| 六安市| 紫金县| 玉田县| 漳州市| 胶州市| 天全县| 台中县| 珲春市| 柳州市| 天门市| 双鸭山市| 石首市| 许昌县| 准格尔旗| 铜鼓县| 兰西县| 卓尼县| 渝北区| 镇坪县| 昌都县| 高平市| 建水县| 图木舒克市| 巴林左旗| 阳高县| 吐鲁番市| 吴旗县| 涞水县| 马关县| 凤阳县| 鄂托克前旗| 响水县| 陇川县| 胶南市| 庄浪县| 芜湖市| 图木舒克市| 平和县| 南川市| 越西县|