欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、CountDownLatch介紹

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

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

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

public static void main(String[] args) throws InterruptedException {
    //內(nèi)部sync同步器的state值設(shè)為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("目標(biāo)代碼塊運(yùn)行完畢");
                //每調(diào)用一次countDown()內(nèi)部調(diào)用releaseShared(1)都會(huì)使state值減一
                countDownLatch.countDown();
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("線程結(jié)束");
        }).start();
    }
    System.out.println("所有線程已啟動(dòng)");
    //主線程調(diào)用await()方法后就會(huì)進(jìn)入阻塞,直到所有線程調(diào)用了countDown()使state值被減為0,或者主線程被中斷,才會(huì)從阻塞返回
    countDownLatch.await();
    System.out.println("所有線程目標(biāo)代碼塊已運(yùn)行完畢");
}

二、CountDownLatch原理

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

當(dāng)一個(gè)線程結(jié)束運(yùn)行調(diào)用countDown()方法時(shí),內(nèi)部調(diào)用releaseShared(1)時(shí)調(diào)用Sync中重寫的鉤子方法tryReleaseShared()都會(huì)使state值減一,當(dāng)被state被減為0后tryReleaseShared才會(huì)返回true,繼而調(diào)用doReleaseShared喚醒同步隊(duì)列中被阻塞的線程

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

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

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

相關(guān)文章

  • Java8 CompletableFuture 異步執(zhí)行操作

    Java8 CompletableFuture 異步執(zhí)行操作

    CompletableFuture是java8提供的基于異步操作的封裝,日常開發(fā)中經(jīng)常會(huì)用到,接下來通過本文給大家介紹Java8 CompletableFuture 異步執(zhí)行操作,感興趣的朋友一起看看吧
    2021-06-06
  • 在Spring Boot中使用swagger-bootstrap-ui的方法

    在Spring Boot中使用swagger-bootstrap-ui的方法

    這篇文章主要介紹了在Spring Boot中使用swagger-bootstrap-ui的方法,需要的朋友可以參考下
    2018-01-01
  • 淺談mybatis-plus批量保存異常及效率優(yōu)化

    淺談mybatis-plus批量保存異常及效率優(yōu)化

    本文主要介紹了mybatis-plus批量保存異常及效率優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Spring中的@ModelAttribute模型屬性綁定詳解

    Spring中的@ModelAttribute模型屬性綁定詳解

    這篇文章主要介紹了Spring中的@ModelAttribute模型屬性綁定詳解,@ModelAttribute用于將方法參數(shù)或返回值綁定到Model屬性上,并公開給Web視圖,支持使用@RequestMapping注釋的Controller類,需要的朋友可以參考下
    2024-02-02
  • Java基礎(chǔ)之String類使用與字符串比較

    Java基礎(chǔ)之String類使用與字符串比較

    String類代表字符串,java程序中的所有字符串文字(例如"abc")都被實(shí)現(xiàn)為此類的實(shí)例。本文將詳解String類的使用,以及如何進(jìn)行字符串比較
    2022-08-08
  • Junit Mockito實(shí)現(xiàn)單元測試方法介紹

    Junit Mockito實(shí)現(xiàn)單元測試方法介紹

    JUnit是用于編寫和運(yùn)行可重復(fù)的自動(dòng)化測試開源測試項(xiàng)目框架,這樣可以保證我們的代碼按與其工作。JUnit可廣泛用于工業(yè)和作為支架(從命令行)或IDE(如IDE)內(nèi)單獨(dú)的java程序
    2022-09-09
  • 在Android系統(tǒng)中解析XML文件的方法

    在Android系統(tǒng)中解析XML文件的方法

    這篇文章主要介紹了在Android系統(tǒng)中解析XML文件的方法,利用Java寫成的XmlPullParser解析器,需要的朋友可以參考下
    2015-07-07
  • 利用ClasserLoader實(shí)現(xiàn)jar包加載并調(diào)用里面的方法

    利用ClasserLoader實(shí)現(xiàn)jar包加載并調(diào)用里面的方法

    classloader即是類加載,虛擬機(jī)把描述類的數(shù)據(jù)從class字節(jié)碼文件加載到內(nèi)存,并對數(shù)據(jù)進(jìn)行檢驗(yàn)、轉(zhuǎn)換解析和初始化,了解java的類加載機(jī)制,可以快速解決運(yùn)行時(shí)的各種加載問題并快速定位其背后的本質(zhì)原因,本文介紹了如何利用ClasserLoader來實(shí)現(xiàn)jar包加載并調(diào)用里面的方法
    2024-09-09
  • Spring Boot使用AOP實(shí)現(xiàn)REST接口簡易靈活的安全認(rèn)證的方法

    Spring Boot使用AOP實(shí)現(xiàn)REST接口簡易靈活的安全認(rèn)證的方法

    這篇文章主要介紹了Spring Boot使用AOP實(shí)現(xiàn)REST接口簡易靈活的安全認(rèn)證的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • java對象和json的來回轉(zhuǎn)換知識點(diǎn)總結(jié)

    java對象和json的來回轉(zhuǎn)換知識點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了一篇關(guān)于java對象和json的來回轉(zhuǎn)換知識點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01

最新評論