日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

闭锁java_java多线程学习十::::CountDownLatch闭锁

發(fā)布時間:2025/3/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 闭锁java_java多线程学习十::::CountDownLatch闭锁 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

請看以下的代碼

package rs.thread.day0504;

import java.util.concurrent.CountDownLatch;

/**

* @auther rs

* @date 2019/5/4 20:32

* @email 529811807@qq.com

* @weixinhao javawjs

*

*/

public class Test10_CountDownLatch {

public static void main(String [] args ){

//執(zhí)行時間

long startTime = System.currentTimeMillis();

//這個是控制幾個線程在執(zhí)行后,在執(zhí)行主線程的任務

int count = 6;

CountDownLatch ld = new CountDownLatch(count);

for(int j =0;j

new Thread(new CountDownLatchThread(ld)){}.start();

}

//等待數(shù)得到0這個數(shù)據(jù)在執(zhí)行

try {

ld.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

long endTime = System.currentTimeMillis();

System.out.println("使用的時間是>>" + (endTime - startTime));

}

}

class CountDownLatchThread implements Runnable{

private CountDownLatch latch ;

public CountDownLatchThread(){}

public CountDownLatchThread(CountDownLatch latch){

this.latch = latch;

}

@Override

public void run() {

for(int i = 0;i<50000;i++){

if(i % 2 == 0){

System.out.println(i);

}

}

//必須控制它減少到0

latch.countDown();

}

}

看了上面的定義和Demo代碼之后,使用就會簡單一點了,一般流程如首先是創(chuàng)建實例 CountDownLatch countDown = new CountDownLatch(2)

需要同步的線程執(zhí)行完之后,計數(shù)-1; countDown.countDown()

需要等待其他線程執(zhí)行完畢之后,再運行的線程,調(diào)用 countDown.await()實現(xiàn)阻塞同步

注意在創(chuàng)建實例是,必須指定初始的計數(shù)值,且應大于0

必須有線程中顯示的調(diào)用了countDown()計數(shù)-1方法;必須有線程顯示調(diào)用了 await()方法(沒有這個就沒有必要使用CountDownLatch了)

由于await()方法會阻塞到計數(shù)為0,如果在代碼邏輯中某個線程漏掉了計數(shù)-1,導致最終計數(shù)一直大于0,直接導致死鎖了

鑒于上面一點,更多的推薦 await(long, TimeUnit)來替代直接使用await()方法,至少不會造成阻塞死只能重啟的情況

應用場景

前面給了一個demo演示如何用,那這個東西在實際的業(yè)務場景中是否會用到呢?

因為確實在一個業(yè)務場景中使用到了,不然也就不會單獨撈出這一節(jié)...

電商的詳情頁,由眾多的數(shù)據(jù)拼裝組成,如可以分成一下幾個模塊交易的收發(fā)貨地址,銷量

商品的基本信息(標題,圖文詳情之類的)

推薦的商品列表

評價的內(nèi)容

....

上面的幾個模塊信息,都是從不同的服務獲取信息,且彼此沒啥關聯(lián);所以為了提高響應,完全可以做成并發(fā)獲取數(shù)據(jù),如線程1獲取交易相關數(shù)據(jù)

線程2獲取商品基本信息

線程3獲取推薦的信息

線程4獲取評價信息

....

但是最終拼裝數(shù)據(jù)并返回給前端,需要等到上面的所有信息都獲取完畢之后,才能返回,這個場景就非常的適合 CountDownLatch來做了在拼裝完整數(shù)據(jù)的線程中調(diào)用 CountDownLatch#await(long, TimeUnit) 等待所有的模塊信息返回

每個模塊信息的獲取,由一個獨立的線程執(zhí)行;執(zhí)行完畢之后調(diào)用 CountDownLatch#countDown() 進行計數(shù)-1

CountDownLatch實現(xiàn)原理就是AQS 的原理

這么好用的功能是怎么實現(xiàn)的呢,下面就來說一說實現(xiàn)它的核心技術原理 AQS。 AQS 全稱 AbstractQueuedSynchronizer,是 java.util.concurrent 中提供的一種高效且可擴展的同步機制。它可以用來實現(xiàn)可以依賴 int 狀態(tài)的同步器,獲取和釋放參數(shù)以及一個內(nèi)部FIFO等待隊列,除了CountDownLatch,ReentrantLock、Semaphore 等功能實現(xiàn)都使用了它。

接下來用 CountDownLatch 來分析一下 AQS 的實現(xiàn)。建議看文章的時候先大致看一下源碼,有助于理解下面所說的內(nèi)容。

在我們的方法中調(diào)用 awit()和countDown()的時候,發(fā)生了幾個關鍵的調(diào)用關系,我畫了一個方法調(diào)用圖。

首先在 CountDownLatch 類內(nèi)部定義了一個 Sync 內(nèi)部類,這個內(nèi)部類就是繼承自 AbstractQueuedSynchronizer 的。并且重寫了方法 tryAcquireShared和tryReleaseShared。例如當調(diào)用 awit()方法時,CountDownLatch 會調(diào)用內(nèi)部類Sync 的 acquireSharedInterruptibly() 方法,然后在這個方法中會調(diào)用 tryAcquireShared 方法,這個方法就是 CountDownLatch 的內(nèi)部類 Sync 里重寫的 AbstractQueuedSynchronizer 的方法。調(diào)用 countDown() 方法同理。

這種方式是使用 AbstractQueuedSynchronizer 的標準化方式,大致分為兩步:

1、內(nèi)部持有繼承自 AbstractQueuedSynchronizer 的對象 Sync;

2、并在 Sync 內(nèi)重寫 AbstractQueuedSynchronizer protected 的部分或全部方法,這些方法包括如下幾個:

總結(jié)

1、AQS 分為獨占模式和共享模式,CountDownLatch 使用了它的共享模式。

2、AQS 當?shù)谝粋€等待線程(被包裝為 Node)要入隊的時候,要保證存在一個 head 節(jié)點,這個 head 節(jié)點不關聯(lián)線程,也就是一個虛節(jié)點。

3、當隊列中的等待節(jié)點(關聯(lián)線程的,非 head 節(jié)點)搶到鎖,將這個節(jié)點設置為 head 節(jié)點。

4、第一次自旋搶鎖失敗后,waitStatus 會被設置為 -1(SIGNAL),第二次再失敗,就會被 LockSupport 阻塞掛起。

5、如果一個節(jié)點的前置節(jié)點為 SIGNAL 狀態(tài),則這個節(jié)點可以嘗試搶占鎖。

歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處!

github: rs1314

歡迎關注共公眾號微信 : java微技術

分享我的學習之路和各種java技術,教程資料

總結(jié)

以上是生活随笔為你收集整理的闭锁java_java多线程学习十::::CountDownLatch闭锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 深夜福利一区二区 | 99久久久无码国产精品衣服 | 日韩精品中文字幕一区二区 | 日韩欧美一区二区一幕 | 日韩久久一区 | asian日本肉体pics | 国产女人水真多18毛片18精品 | 亚洲一区电影网 | zzjizzji亚洲日本少妇 | 欧美性色黄大片手机版 | 老司机激情视频 | 羞羞网站在线看 | 亚洲天堂导航 | a√在线视频 | 久久国产免费观看 | 国产一区二区视频在线观看免费 | 熟女丰满老熟女熟妇 | 国产在线色视频 | 美女av毛片 | 一区二区三区在线观看免费 | 天天干夜夜嗨 | 亚洲精品国产视频 | 久久综合加勒比 | 99久久网站 | 亚洲无码国产精品 | 黄色日韩视频 | 国产精品99精品久久免费 | 久久成人福利视频 | 亚洲精品成人片在线观看精品字幕 | av在线天天 | 日韩中文字幕在线看 | 娇妻被老王脔到高潮失禁视频 | 国产一区免费看 | 中国精品久久 | 久久精品视频中文字幕 | 美景之屋电影免费高清完整韩剧 | 糖心vlog精品一区二区 | 色www.| 快色av | 亚洲欧美激情在线观看 | 狠狠干b| 久久露脸国语精品国产 | 欧美日韩性生活 | 香蕉国产999| 午夜精品一区二区三区免费视频 | 在线不卡欧美 | 国产成人中文字幕 | 黄色国产一级 | 亚洲精品乱码久久久久久日本蜜臀 | 999国产在线| 亚洲插插插 | 扶她futa粗大做到怀孕 | 亚洲AV综合色区无码国产播放 | 国产精品51麻豆cm传媒 | 河北彩花av在线播放 | 91一级视频 | 亚洲精品高清视频在线观看 | 欧美性猛交ⅹ乱大交3 | 亚洲人成色777777精品音频 | 日韩高清黄色 | 日韩成人一区二区三区 | 亚洲а∨天堂久久精品2021 | 国产伊人一区 | 亚洲论理| 亚洲爱视频 | 成人精品久久久午夜福利 | 中文字幕一区二区三区人妻电影 | 精品99久久久| 人妻丝袜一区 | 男女视频在线观看免费 | 成人综合激情 | 天天干天天摸 | 久国产精品 | 大乳护士喂奶hd | 美女黄18以下禁止观看 | 2020av在线| 国产精品欧美激情在线 | 在线黄色av | 成人动漫av | 别揉我奶头一区二区三区 | 告诉我真相俄剧在线观看 | 日韩精品卡通动漫网站 | 少妇自拍视频 | 91色网站 | 免费一级肉体全黄毛片 | 阿v天堂在线| 在线观看1区 | 日b在线观看 | 91九色成人 | 成人国产精品入口免费视频 | 伊人色综合网 | 国产精品自拍亚洲 | 亚洲精选av | 久久网中文字幕 | 日本不卡一区二区 | 亚洲第一精品在线 | 免费观看在线视频 | 久国产精品 | 久久综合精品国产二区无码不卡 |