多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

1、CountDownLatch介紹

1.1 CountDownLatch的使用,請(qǐng)參考文章 多線程(七、同步計(jì)數(shù)器-CountDownLatch

2、案例分析

2.1 說明:

1、Thread-1執(zhí)行await,等待主線程放行;
2、Thread-2執(zhí)行await,等待主線程放行;
3、主線程執(zhí)行countDown()放行。

創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè)|網(wǎng)站維護(hù)|優(yōu)化|托管以及網(wǎng)絡(luò)推廣,積累了大量的網(wǎng)站設(shè)計(jì)與制作經(jīng)驗(yàn),為許多企業(yè)提供了網(wǎng)站定制設(shè)計(jì)服務(wù),案例作品覆蓋成都廣告推廣等行業(yè)。能根據(jù)企業(yè)所處的行業(yè)與銷售的產(chǎn)品,結(jié)合品牌形象的塑造,量身定制品質(zhì)網(wǎng)站。

3、源碼分析

3.1 CountDownLatch的構(gòu)造函數(shù)和如何使用AQS的同步狀態(tài):

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))
多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

1、CountDownLatch的初始計(jì)數(shù)器就是直接設(shè)置AQS的同步狀態(tài)值state
2、countDown就是對(duì)state執(zhí)行減1
3、當(dāng)state為0的時(shí)候,放行。

3.2 Thread-1調(diào)用await

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

3.2.1 就是調(diào)用AQS的acquireSharedInterruptibly方法

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

3.2.2 tryAcquireShared的實(shí)現(xiàn)要比ReentrantLock簡(jiǎn)單很多

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

只要state是0,則所有獲取資源的申請(qǐng)都會(huì)成功,這就是共享鎖的含義。

3.2.3 如果主線程不放行,state不等于0,,申請(qǐng)失敗,會(huì)執(zhí)行doAcquireSharedInterruptibly

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

此時(shí),自旋獲取一次也會(huì)失敗,會(huì)進(jìn)行阻塞,進(jìn)入【等待隊(duì)列】

3.3 Thread-2調(diào)用await,結(jié)果同上,Thread-2也進(jìn)入【等待隊(duì)列】

3.4 主線程放行countDown()

3.4.1 countDown()

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

tryReleaseShared方法

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

然后執(zhí)行doReleaseShared,喚醒Thread-1

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

Thread-1被喚醒后,從阻塞的地方繼續(xù)執(zhí)行,重新獲取資源,此時(shí)state=0,則會(huì)獲取成功

多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))

然后執(zhí)行:setHeadAndPropagate方法把ThreadA結(jié)點(diǎn)變?yōu)轭^結(jié)點(diǎn),并根據(jù)傳播狀態(tài)判斷是否要喚醒并釋放后繼結(jié)點(diǎn)
private void setHeadAndPropagate(Node node, int propagate) {
        Node h = head; // Record old head for check below
        setHead(node);//設(shè)置當(dāng)前節(jié)點(diǎn)為頭節(jié)點(diǎn)

        if (propagate > 0 || h == null || h.waitStatus < 0 ||
                (h = head) == null || h.waitStatus < 0) {
            Node s = node.next;
            if (s == null || s.isShared()) //后繼節(jié)點(diǎn)如果是共享的,則依次喚醒后繼節(jié)點(diǎn),這就是共享的原理
                doReleaseShared();
        }
    }

3.5 Thread-1會(huì)繼續(xù)喚醒Thread-2,Thread-2繼續(xù)執(zhí)行,會(huì)繼續(xù)喚醒后續(xù)共享節(jié)點(diǎn),此時(shí)后面沒有節(jié)點(diǎn)了,程序完成。

文章題目:多線程(十二、AQS原理-CountDownLatch基于AQS的共享實(shí)現(xiàn))
當(dāng)前網(wǎng)址:http://muchs.cn/article22/pgohjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、企業(yè)建站、網(wǎng)站收錄網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司