亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

AQS同步組件--CountDownLatch

jackzou / 1860人閱讀

摘要:當(dāng)計(jì)數(shù)器值到達(dá)時(shí),它表示所有的線程已經(jīng)完成了任務(wù),然后在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)。這個(gè)類使用線程在達(dá)到某個(gè)條件后繼續(xù)執(zhí)行的情況。

CountDownLatch

CountDownLatch是在java1.5被引入的,跟它一起被引入的并發(fā)工具類還有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它們都存在于java.util.concurrent包下。CountDownLatch這個(gè)類能夠使一個(gè)線程等待其他線程完成各自的工作后再執(zhí)行。例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有的框架服務(wù)之后再執(zhí)行。
CountDownLatch是通過一個(gè)計(jì)數(shù)器來實(shí)現(xiàn)的,計(jì)數(shù)器的初始值為線程的數(shù)量。每當(dāng)一個(gè)線程完成了自己的任務(wù)后,計(jì)數(shù)器的值就會(huì)減1。當(dāng)計(jì)數(shù)器值到達(dá)0時(shí),它表示所有的線程已經(jīng)完成了任務(wù),然后在閉鎖上等待的線程就可以恢復(fù)執(zhí)行任務(wù)。

調(diào)用CountDownLatch類的await()方法會(huì)一直阻塞,直到其他線程調(diào)用CountDown()方法使計(jì)數(shù)器的值減1,當(dāng)計(jì)數(shù)器的值等于0則當(dāng)因調(diào)用await()方法處于阻塞狀態(tài)的線程會(huì)被喚醒繼續(xù)執(zhí)行。計(jì)數(shù)器是不能被重置的。這個(gè)類使用線程在達(dá)到某個(gè)條件后繼續(xù)執(zhí)行的情況。比如并行計(jì)算,計(jì)算量特別大,我可以將計(jì)算量拆分成多個(gè)線程進(jìn)行計(jì)算,最后將結(jié)果匯總。

一個(gè)CountdownLatch 例子

@Slf4j
public class CountDownLatchExample1 {

    private final static int threadCount = 200;

    public static void main(String[] args) throws Exception {

        ExecutorService exec = Executors.newCachedThreadPool();

        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    test(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                } finally {
                    countDownLatch.countDown();
                }
            });
        }
        countDownLatch.await();
        log.info("finish");
        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        Thread.sleep(100);
        log.info("{}", threadNum);
        Thread.sleep(100);
    }
}

我們在線程之后都調(diào)用了countDown方法,在執(zhí)行l(wèi)og之前調(diào)用了await方法,從而來保證打印日志時(shí)一定是在所有線程執(zhí)行完。假設(shè)我們不使用CountDownLatch時(shí)結(jié)果會(huì)怎么樣?

@Slf4j
public class CountDownLatchExample1 {

    private final static int threadCount = 200;

    public static void main(String[] args) throws Exception {

        ExecutorService exec = Executors.newCachedThreadPool();

        final CountDownLatch countDownLatch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            final int threadNum = i;
            exec.execute(() -> {
                try {
                    test(threadNum);
                } catch (Exception e) {
                    log.error("exception", e);
                }
//                finally {
////                    countDownLatch.countDown();
//                }
            });
        }
//        countDownLatch.await();
        log.info("finish");
//        exec.shutdown();
    }

    private static void test(int threadNum) throws Exception {
        Thread.sleep(100);
        log.info("{}", threadNum);
        Thread.sleep(100);
    }
}

這段代碼打印結(jié)果就是,一開始就打印出了finish,因?yàn)檫@個(gè)打印是在主線程中執(zhí)行。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/77633.html

相關(guān)文章

  • Java 線程同步組件 CountDownLatch 與 CyclicBarrier 原理分析

    摘要:在創(chuàng)建對象時(shí),需要轉(zhuǎn)入一個(gè)值,用于初始化的成員變量,該成員變量表示屏障攔截的線程數(shù)。當(dāng)?shù)竭_(dá)屏障的線程數(shù)小于時(shí),這些線程都會(huì)被阻塞住。當(dāng)所有線程到達(dá)屏障后,將會(huì)被更新,表示進(jìn)入新一輪的運(yùn)行輪次中。 1.簡介 在分析完AbstractQueuedSynchronizer(以下簡稱 AQS)和ReentrantLock的原理后,本文將分析 java.util.concurrent 包下的兩個(gè)...

    Anonymous1 評論0 收藏0
  • AQS同步組件--CyclicBarrier

    摘要:也是一個(gè)同步輔助類,它允許一組線程相互等待直到到達(dá)某個(gè)工作屏障點(diǎn),通過他可以完成多線程之間的相互等待。每個(gè)線程都就緒之后才能執(zhí)行后面的操作。是可重用的計(jì)數(shù)器,的使用場景和的使用場景很相似,可以用于多線程計(jì)算數(shù)據(jù)最后總計(jì)結(jié)果。 CyclicBarrier CyclicBarrier也是一個(gè)同步輔助類,它允許一組線程相互等待直到到達(dá)某個(gè)工作屏障點(diǎn),通過他可以完成多線程之間的相互等待。每個(gè)線...

    Null 評論0 收藏0
  • AQS同步組件--ReentrantLock與鎖

    摘要:性能較好是因?yàn)楸苊饬司€程進(jìn)入內(nèi)核的阻塞狀態(tài)請求總數(shù)同時(shí)并發(fā)執(zhí)行的線程數(shù)我們首先使用聲明一個(gè)所得實(shí)例,然后使用進(jìn)行加鎖和解鎖操作。 ReentrantLock與鎖 Synchronized和ReentrantLock異同 可重入性:兩者都具有可重入性 鎖的實(shí)現(xiàn):Synchronized是依賴jvm實(shí)現(xiàn)的,ReentrantLock是jdk實(shí)現(xiàn)的。(我們可以理解為一個(gè)是操作系統(tǒng)層面的實(shí)現(xiàn)...

    dcr309duan 評論0 收藏0
  • Java多線程進(jìn)階(九)—— J.U.C之locks框架:AQS共享功能剖析(4)

    摘要:好了,繼續(xù)向下執(zhí)行,嘗試獲取鎖失敗后,會(huì)調(diào)用首先通過方法,將包裝成共享結(jié)點(diǎn),插入等待隊(duì)列,插入完成后隊(duì)列結(jié)構(gòu)如下然后會(huì)進(jìn)入自旋操作,先嘗試獲取一次鎖,顯然此時(shí)是獲取失敗的主線程還未調(diào)用,同步狀態(tài)還是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首發(fā)于一世流云的專欄:https://segmentfa...

    CompileYouth 評論0 收藏0
  • Java同步機(jī)制的底層實(shí)現(xiàn)

    摘要:在多線程編程中我們會(huì)遇到很多需要使用線程同步機(jī)制去解決的并發(fā)問題,而這些同步機(jī)制就是多線程編程中影響正確性和運(yùn)行效率的重中之重。這五個(gè)方法之所以能指定同步器的行為,則是因?yàn)橹械钠渌椒ň褪峭ㄟ^對這五個(gè)方法的調(diào)用來實(shí)現(xiàn)的。 在多線程編程中我們會(huì)遇到很多需要使用線程同步機(jī)制去解決的并發(fā)問題,而這些同步機(jī)制就是多線程編程中影響正確性和運(yùn)行效率的重中之重。這不禁讓我感到好奇,這些同步機(jī)制是如何...

    yintaolaowanzi 評論0 收藏0

發(fā)表評論

0條評論

jackzou

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<