日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

沒看過ReentrantLock源碼,別說精通Java并發(fā)編程

來源: 責(zé)編: 時間:2024-03-18 09:36:21 232觀看
導(dǎo)讀引言高手程序員與新手程序員一個簡單的判斷標(biāo)準(zhǔn),就是有沒有使用過CountDownLatch,在互聯(lián)網(wǎng)公司工作超過3年的程序員基本上應(yīng)該都用過。CountDownLatch中文名稱叫做閉鎖,也叫計(jì)數(shù)鎖,不過不是用來加鎖的,而是通過計(jì)數(shù)實(shí)現(xiàn)條

引言

高手程序員與新手程序員一個簡單的判斷標(biāo)準(zhǔn),就是有沒有使用過CountDownLatch,在互聯(lián)網(wǎng)公司工作超過3年的程序員基本上應(yīng)該都用過。CountDownLatch中文名稱叫做閉鎖,也叫計(jì)數(shù)鎖,不過不是用來加鎖的,而是通過計(jì)數(shù)實(shí)現(xiàn)條件等待的功能。CountDownLatch的使用場景有兩個:e1l28資訊網(wǎng)——每日最新資訊28at.com

  1. 當(dāng)前線程等待其他線程都執(zhí)行完成之后,再執(zhí)行。
  2. 所有線程滿足條件后,再一起執(zhí)行。

使用示例

CountDownLatch常用的方法就兩個,countDown()方法用來將計(jì)數(shù)器減一,await()方法會阻塞當(dāng)前線程,直到計(jì)數(shù)器值等于0。e1l28資訊網(wǎng)——每日最新資訊28at.com

場景1:

先看一下第一種場景,也是最常用的場景:e1l28資訊網(wǎng)——每日最新資訊28at.com

  • 當(dāng)前線程等待其他線程都執(zhí)行完成之后,再執(zhí)行。

在工作中什么時候會遇到這種場景呢?比如當(dāng)前線程需要查詢3個數(shù)據(jù)庫,并且把查詢結(jié)果匯總返回給前端。查詢3個數(shù)據(jù)庫的邏輯,可以分別使用3個線程加快查詢速度。但是怎么判斷3個線程都執(zhí)行結(jié)束了呢?這時候就可以使用CountDownLatch了。e1l28資訊網(wǎng)——每日最新資訊28at.com

import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * @author 一燈架構(gòu) * @apiNote CountDownLatch測試類(場景1) **/public class CountDownLatchTest1 {    public static void main(String[] args) throws InterruptedException {        // 1. 創(chuàng)建一個線程池,用來執(zhí)行3個查詢?nèi)蝿?wù)        ExecutorService executorService = Executors.newFixedThreadPool(3);        // 2. 創(chuàng)建一個計(jì)數(shù)鎖,數(shù)量是3        CountDownLatch countDownLatch = new CountDownLatch(3);        // 3. 啟動3個查詢?nèi)蝿?wù)        for (int i = 0; i < 3; i++) {            executorService.submit(() -> {                try {                    // 4. 睡眠1秒,模擬任務(wù)執(zhí)行過程                    Thread.sleep(1000);                    System.out.println(Thread.currentThread().getName() + " 執(zhí)行完成");                    // 5. 任務(wù)執(zhí)行完成,計(jì)數(shù)器減一                    countDownLatch.countDown();                } catch (InterruptedException e) {                }            });        }        // 6. 等待所有任務(wù)執(zhí)行完成        countDownLatch.await();        System.out.println("所有任務(wù)執(zhí)行完成。");        // 7. 關(guān)閉線程池        executorService.shutdown();    }}

輸出結(jié)果:e1l28資訊網(wǎng)——每日最新資訊28at.com

pool-1-thread-2 執(zhí)行完成 pool-1-thread-1 執(zhí)行完成 pool-1-thread-3 執(zhí)行完成 所有任務(wù)執(zhí)行完成。e1l28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,這里創(chuàng)建CountDownLatch計(jì)數(shù)器的時候,指定的數(shù)量是3,因?yàn)橛?個任務(wù)。在3個任務(wù)沒有執(zhí)行完成之前,await()方法會一直阻塞,直到3個任務(wù)都執(zhí)行完成。e1l28資訊網(wǎng)——每日最新資訊28at.com

場景2

再看一下第二種場景,有些情況用的也比較多:e1l28資訊網(wǎng)——每日最新資訊28at.com

  • 所有線程滿足條件后,再一起執(zhí)行。

什么情況下會遇到這種場景呢?比如系統(tǒng)中多個任務(wù)線程存在先后依賴關(guān)系,必須等待其他線程啟動完成后,才能一起執(zhí)行。e1l28資訊網(wǎng)——每日最新資訊28at.com

/** * @author 一燈架構(gòu) * @apiNote CountDownLatch測試類(場景2) **/public class CountDownLatchTest {    public static void main(String[] args) throws InterruptedException {        // 1. 創(chuàng)建一個線程池,用來執(zhí)行3個任務(wù)        ExecutorService executorService = Executors.newFixedThreadPool(3);        // 2. 創(chuàng)建一個計(jì)數(shù)鎖,數(shù)量是1        CountDownLatch countDownLatch = new CountDownLatch(1);        // 3. 啟動3個任務(wù)        for (int i = 0; i < 3; i++) {            executorService.submit(() -> {                try {                    System.out.println(Thread.currentThread().getName() + " 啟動完成");                    // 4. 等待其他任務(wù)啟動完成                    countDownLatch.await();                    // 5. 睡眠1秒,模擬任務(wù)執(zhí)行過程                    Thread.sleep(1000);                    System.out.println(Thread.currentThread().getName() + " 執(zhí)行完成");                } catch (InterruptedException e) {                }            });        }        // 6. 所有任務(wù)啟動完成,計(jì)數(shù)器減一        countDownLatch.countDown();        System.out.println("所有任務(wù)啟動完成,開始執(zhí)行。");        // 7. 關(guān)閉線程池        executorService.shutdown();    }}

輸出結(jié)果:e1l28資訊網(wǎng)——每日最新資訊28at.com

pool-1-thread-1 啟動完成 pool-1-thread-2 啟動完成 pool-1-thread-3 啟動完成 所有任務(wù)啟動完成,開始執(zhí)行。 pool-1-thread-1 執(zhí)行完成 pool-1-thread-3 執(zhí)行完成 pool-1-thread-2 執(zhí)行完成e1l28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,與場景1不同,這里創(chuàng)建CountDownLatch計(jì)數(shù)器的時候,指定的數(shù)量是1,因?yàn)?個任務(wù)需要滿足同一個條件,就是都啟動完成,也就是只需要調(diào)用一次countDown()方法。 看完了CountDownLatch的使用方式,再看一下CountDownLatch的源碼實(shí)現(xiàn)。e1l28資訊網(wǎng)——每日最新資訊28at.com

類屬性

public class CountDownLatch {    // 只有一個Sync同步變量    private final Sync sync;    // Sync繼承自AQS,主要邏輯都在這里面    private static final class Sync extends AbstractQueuedSynchronizer {        // 只有這一個構(gòu)造方法,需要指定計(jì)數(shù)器數(shù)值        Sync(int count) {            setState(count);        }        int getCount() {            return getState();        }        protected int tryAcquireShared(int acquires) {            return (getState() == 0) ? 1 : -1;        }        protected boolean tryReleaseShared(int releases) {            for (;;) {                int c = getState();                if (c == 0)                    return false;                int nextc = c-1;                if (compareAndSetState(c, nextc))                    return nextc == 0;            }        }    }}

跟ReentrantLock一樣,CountDownLatch也沒有直接繼承AQS,也是采用組合的方式,使用Sync同步變量實(shí)現(xiàn)計(jì)數(shù)的功能,而Sync同步變量才是真正繼承AQS的。e1l28資訊網(wǎng)——每日最新資訊28at.com

countDown方法源碼

public void countDown() {    // 底層調(diào)用父類AQS中的releaseShared()方法    sync.releaseShared(1);}

countDown()方法里面調(diào)用的是父類AQS中的releaseShared()方法,而releaseShared()方法又在調(diào)用子類Sync中tryReleaseShared()方法。e1l28資訊網(wǎng)——每日最新資訊28at.com

/** * 父類AQS */public abstract class AbstractQueuedSynchronizer        extends AbstractOwnableSynchronizer        implements java.io.Serializable {                public final boolean releaseShared(int arg) {        // tryReleaseShared()由子類實(shí)現(xiàn)        if (tryReleaseShared(arg)) {            doReleaseShared();            return true;        }        return false;    }    // 定義抽象方法,由子類實(shí)現(xiàn)    protected boolean tryReleaseShared(int arg) {        throw new UnsupportedOperationException();    }}
/** * 子類Sync */private static final class Sync extends AbstractQueuedSynchronizer {        // 實(shí)現(xiàn)父類AQS中的tryReleaseShared()方法    @Override    protected boolean tryReleaseShared(int releases) {        for (;;) {            int c = getState();            if (c == 0) {                return false;            }            int nextc = c-1;            if (compareAndSetState(c, nextc)) {                return nextc == 0;            }        }    }}

而Sync同步類中tryReleaseShared()方法邏輯也很簡單,就是把同步狀態(tài)state值減一。e1l28資訊網(wǎng)——每日最新資訊28at.com

await源碼

await()方法底層也是調(diào)用父類中acquireSharedInterruptibly()方法,而父類AQS又需要調(diào)用子類Sync中的具體實(shí)現(xiàn)。e1l28資訊網(wǎng)——每日最新資訊28at.com

public void await() throws InterruptedException {    // 底層調(diào)用父類AQS中的releaseShared()方法    sync.acquireSharedInterruptibly(1);}
/** * 父類AQS */public abstract class AbstractQueuedSynchronizer        extends AbstractOwnableSynchronizer        implements java.io.Serializable {    public final void acquireSharedInterruptibly(int arg) throws InterruptedException {        if (Thread.interrupted()) {            throw new InterruptedException();        }        // tryAcquireShared()由子類實(shí)現(xiàn)        if (tryAcquireShared(arg) < 0) {            doAcquireSharedInterruptibly(arg);        }    }    // 定義抽象方法,由子類實(shí)現(xiàn)    protected int tryAcquireShared(int arg) {        throw new UnsupportedOperationException();    }}

子類Sync只需要實(shí)現(xiàn)tryAcquireShared()方法即可,而tryAcquireShared()方法的作用就是判斷鎖是否已經(jīng)完全釋放,即同步狀態(tài)state=0。e1l28資訊網(wǎng)——每日最新資訊28at.com

/** * 子類Sync */private static final class Sync extends AbstractQueuedSynchronizer {    // 實(shí)現(xiàn)父類AQS中的tryAcquireShared()方法    @Override    protected int tryAcquireShared(int acquires) {        return (getState() == 0) ? 1 : -1;    }}

總結(jié)

看完了CountDownLatch的所有源碼,是不是覺得CountDownLatch邏輯很簡單。e1l28資訊網(wǎng)——每日最新資訊28at.com

因?yàn)榧渔i流程的編排工作已經(jīng)在父類AQS中實(shí)現(xiàn),子類只需要實(shí)現(xiàn)具體的加鎖邏輯即可,也就是實(shí)現(xiàn)tryReleaseShared()方法和tryAcquireShared()方法。而加鎖邏輯也很簡單,也就是修改同步狀態(tài)state的值即可。想要詳細(xì)了解父類AQS的流程,可以翻看前幾篇文章。e1l28資訊網(wǎng)——每日最新資訊28at.com

下篇文章再一塊學(xué)習(xí)一下共享鎖Semaphore的源碼實(shí)現(xiàn)。e1l28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-76485-0.html沒看過ReentrantLock源碼,別說精通Java并發(fā)編程

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 工作中最常見的六種OOM問題

下一篇: 一個很有意思的Spring注入問題,你遇到過嗎?

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲欧美电影院| 亚洲精品欧美极品| 国产精品久久久久9999高清 | 欧美一区日韩一区| 久久久久国色av免费观看性色| 久久久久国产精品厨房| 欧美成年人视频网站| 欧美三级视频在线观看| 国产女人18毛片水18精品| 在线国产精品播放| 99精品国产在热久久| 午夜精品久久久久久久蜜桃app| 久久久久国产精品麻豆ai换脸| 欧美激情第六页| 国产精品人人做人人爽人人添| 精品动漫3d一区二区三区免费| 亚洲久久成人| 欧美在线视频二区| 欧美精品一区三区| 国产色产综合产在线视频| 亚洲欧洲在线一区| 欧美一区二区免费观在线| 蜜桃视频一区| 国产精品视频一二三| 亚洲国产1区| 亚洲欧美一区二区三区久久| 女主播福利一区| 国产精品丝袜xxxxxxx| 亚洲黄色大片| 欧美在线视频观看免费网站| 欧美日韩国产精品一区| 好吊视频一区二区三区四区| 亚洲婷婷国产精品电影人久久| 久久在线播放| 国产精品一区三区| 99国产精品| 免费人成精品欧美精品| 国产精品视频免费观看| 亚洲日本无吗高清不卡| 久久精品一本| 国产精品美女久久久久aⅴ国产馆| 亚洲成色www久久网站| 性娇小13――14欧美| 欧美日韩一区二区免费视频| 亚洲成人原创 | 91久久精品一区二区别| 欧美一区二区三区四区视频| 欧美日韩精品免费看| 亚洲国产你懂的| 久久激五月天综合精品| 国产精品看片你懂得| 亚洲美女视频在线观看| 久久综合影视| 韩国精品在线观看| 久久99伊人| 国产精品丝袜久久久久久app| 这里只有精品视频在线| 欧美久久电影| 亚洲片区在线| 欧美成人午夜| 亚洲电影在线看| 久久久综合网站| 国产一区二区按摩在线观看| 亚洲综合成人婷婷小说| 欧美视频在线一区二区三区| 亚洲精品美女免费| 欧美电影打屁股sp| 亚洲国产精品久久久久秋霞蜜臀| 久久国产精品99国产精| 国产欧美一区二区三区在线老狼| 亚洲综合另类| 国产精品亚洲产品| 亚洲欧美日韩中文在线制服| 国产精品久久影院| 亚洲在线第一页| 国产精品久久婷婷六月丁香| 亚洲午夜91| 国产精品久久久久久久app| 亚洲视频你懂的| 国产精品高潮呻吟久久av无限 | 激情综合在线| 久久天堂精品| 伊伊综合在线| 男人插女人欧美| 亚洲激情视频网| 欧美激情视频一区二区三区免费 | 亚洲一区二区三区在线观看视频 | 99精品视频免费观看| 欧美精品免费视频| 99爱精品视频| 欧美亚洲成人免费| 亚洲综合电影一区二区三区| 国产精品一级| 久久精品国产亚洲精品| 精品91在线| 欧美成人精品在线视频| 日韩天堂在线观看| 国产精品v片在线观看不卡 | 免费在线欧美视频| 亚洲精品孕妇| 国产精品成人v| 久久精品国产成人| 亚洲国产经典视频| 欧美日韩另类字幕中文| 亚洲女人天堂成人av在线| 国产精品丝袜白浆摸在线| 欧美一区午夜视频在线观看| 怡红院av一区二区三区| 欧美激情成人在线视频| 亚洲小说区图片区| 狠狠综合久久| 欧美精品精品一区| 亚洲一区视频在线| 国外成人网址| 欧美日产国产成人免费图片| 午夜欧美不卡精品aaaaa| 狠久久av成人天堂| 欧美激情在线狂野欧美精品| 亚洲欧美精品在线| 伊人精品在线| 欧美日韩少妇| 久久av二区| 91久久精品视频| 国产精品久久久99| 久久视频这里只有精品| 亚洲免费观看| 国产亚洲一区二区三区| 欧美精品18+| 欧美一区二区精美| 亚洲欧洲精品一区| 国产精品麻豆va在线播放| 久久综合一区| 亚洲伊人色欲综合网| 禁久久精品乱码| 欧美日韩在线免费| 久久亚洲国产精品日日av夜夜| 中国女人久久久| 在线精品视频免费观看 | 亚洲国产视频直播| 国产麻豆91精品| 欧美国产三级| 久久精品道一区二区三区| 日韩一级二级三级| 黄网站免费久久| 国产精品v亚洲精品v日韩精品 | 亚洲免费人成在线视频观看| 1024精品一区二区三区| 国产精品每日更新| 欧美电影免费观看大全| 欧美一区二区三区免费大片| 亚洲日本va午夜在线电影| 国产日韩欧美亚洲一区| 欧美日韩视频在线一区二区| 久久亚洲色图| 午夜精品免费| 99这里有精品| 亚洲国产精品传媒在线观看| 国产手机视频精品| 国产精品video| 欧美不卡高清| 久久精品亚洲一区二区三区浴池| 中文在线不卡视频| 亚洲精选一区二区| 亚洲国产精品久久久| 国产一区二区三区免费观看| 欧美性猛交99久久久久99按摩| 免费在线观看一区二区| 久久精品国产亚洲aⅴ| 亚洲与欧洲av电影| a91a精品视频在线观看| 亚洲第一精品夜夜躁人人躁| 国产欧美一区二区精品仙草咪| 欧美午夜激情小视频| 欧美激情偷拍| 欧美69wwwcom| 另类成人小视频在线| 久久精品动漫| 欧美一区二区三区视频在线观看 | 影音先锋日韩精品| 国产日韩精品久久| 国产精品久久一卡二卡| 欧美日韩一区二区三区免费| 欧美精品精品一区| 欧美成人亚洲成人日韩成人| 久久三级福利| 久久蜜桃香蕉精品一区二区三区| 欧美一区国产二区| 香蕉久久夜色精品国产| 午夜精品一区二区三区四区 | 老司机67194精品线观看| 久久狠狠亚洲综合| 欧美在线视频二区| 欧美中文字幕久久| 欧美一级黄色录像| 欧美一区二区三区播放老司机| 午夜欧美大尺度福利影院在线看| 亚洲永久免费观看| 亚洲男人的天堂在线aⅴ视频| 亚洲特级片在线| 亚洲伊人伊色伊影伊综合网| 亚洲一区二区高清| 亚洲综合色自拍一区| 亚洲欧美在线观看| 欧美一区二区免费观在线|