精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一篇帶給你CountDownLatch實現原理

開發 后端
CountDownLatch是多線程中一個比較重要的概念,它可以使得一個或多個線程等待其他線程執行完畢之后再執行。

 前言

CountDownLatch是多線程中一個比較重要的概念,它可以使得一個或多個線程等待其他線程執行完畢之后再執行。它內部有一個計數器和一個阻塞隊列,每當一個線程調用countDown()方法后,計數器的值減少1。當計數器的值不為0時,調用await()方法的線程將會被加入到阻塞隊列,一直阻塞到計數器的值為0。

常用方法

  1. public class CountDownLatch { 
  2.  
  3.     //構造一個值為count的計數器 
  4.     public CountDownLatch(int count); 
  5.  
  6.     //阻塞當前線程直到計數器為0 
  7.     public void await() throws InterruptedException; 
  8.  
  9.     //在單位為unit的timeout時間之內阻塞當前線程 
  10.     public boolean await(long timeout, TimeUnit unit); 
  11.  
  12.     //將計數器的值減1,當計數器的值為0時,阻塞隊列內的線程才可以運行 
  13.     public void countDown();       
  14.  

下面給一個簡單的示例:

  1. package com.yang.testCountDownLatch; 
  2.  
  3. import java.util.concurrent.CountDownLatch; 
  4.  
  5. public class Main { 
  6.     private static final int NUM = 3; 
  7.  
  8.     public static void main(String[] args) throws InterruptedException { 
  9.         CountDownLatch latch = new CountDownLatch(NUM); 
  10.         for (int i = 0; i < NUM; i++) { 
  11.             new Thread(() -> { 
  12.                 try { 
  13.                     Thread.sleep(2000); 
  14.                     System.out.println(Thread.currentThread().getName() + "運行完畢"); 
  15.                 } catch (InterruptedException e) { 
  16.                     e.printStackTrace(); 
  17.                 } finally { 
  18.                     latch.countDown(); 
  19.                 } 
  20.             }).start(); 
  21.         } 
  22.         latch.await(); 
  23.         System.out.println("主線程運行完畢"); 
  24.     } 

輸出如下:

看得出來,主線程會等到3個子線程執行完畢才會執行。

原理解析

類圖

 

可以看得出來,CountDownLatch里面有一個繼承AQS的內部類Sync,其實是AQS來支持CountDownLatch的各項操作的。

CountDownLatch(int count)

new CountDownLatch(int count)用來創建一個AQS同步隊列,并將計數器的值賦給了AQS的state。

  1. public CountDownLatch(int count) { 
  2.     if (count < 0) throw new IllegalArgumentException("count < 0"); 
  3.     this.sync = new Sync(count); 
  4.  
  5. private static final class Sync extends AbstractQueuedSynchronizer {      
  6.     Sync(int count) { 
  7.         setState(count); 
  8.     } 
  9.  

countDown()

countDown()方法會對計數器進行減1的操作,當計數器值為0時,將會喚醒在阻塞隊列中等待的所有線程。其內部調用了Sync的releaseShared(1)方法

  1. public void countDown() { 
  2.      sync.releaseShared(1); 
  3.  } 
  4.  
  5.  public final boolean releaseShared(int arg) { 
  6.      if (tryReleaseShared(arg)) { 
  7.          //此時計數器的值為0,喚醒所有被阻塞的線程 
  8.          doReleaseShared(); 
  9.          return true
  10.      } 
  11.      return false
  12.  } 

tryReleaseShared(arg)內部使用了自旋+CAS操將計數器的值減1,當減為0時,方法返回true,將會調用doReleaseShared()方法。對CAS機制不了解的同學,可以先參考我的另外一篇文章淺探CAS實現原理

  1. protected boolean tryReleaseShared(int releases) { 
  2.       //自旋 
  3.       for (;;) { 
  4.           int c = getState(); 
  5.           if (c == 0) 
  6.               //此時計數器的值已經為0了,其他線程早就執行完畢了,當前線程也已經再執行了,不需要再次喚醒了 
  7.               return false
  8.           int nextc = c-1; 
  9.           //使用CAS機制,將state的值變為state-1 
  10.           if (compareAndSetState(c, nextc)) 
  11.               return nextc == 0; 
  12.       } 
  13.   } 

doReleaseShared()是AQS中的方法,該方法會喚醒隊列中所有被阻塞的線程。

  1. private void doReleaseShared() { 
  2.      for (;;) { 
  3.          Node h = head; 
  4.          if (h != null && h != tail) { 
  5.              int ws = h.waitStatus; 
  6.              if (ws == Node.SIGNAL) { 
  7.                  if (!compareAndSetWaitStatus(h, Node.SIGNAL, 0)) 
  8.                      continue;            // loop to recheck cases 
  9.                  unparkSuccessor(h); 
  10.              } 
  11.              else if (ws == 0 && 
  12.                       !compareAndSetWaitStatus(h, 0, Node.PROPAGATE)) 
  13.                  continue;                // loop on failed CAS 
  14.          } 
  15.          if (h == head)                   // loop if head changed 
  16.              break; 
  17.      } 
  18.  } 

這段方法比較難理解,會另外篇幅介紹。這里只要認為該段方法會喚醒所有因調用await()方法而阻塞的線程。

await()

當計數器的值不為0時,該方法會將當前線程加入到阻塞隊列中,并把當前線程掛起。

  1. public void await() throws InterruptedException { 
  2.     sync.acquireSharedInterruptibly(1); 

同樣是委托內部類Sync,調用其

acquireSharedInterruptibly()方法

  1. public final void acquireSharedInterruptibly(int arg) 
  2.           throws InterruptedException { 
  3.       if (Thread.interrupted()) 
  4.           throw new InterruptedException(); 
  5.       if (tryAcquireShared(arg) < 0) 
  6.           doAcquireSharedInterruptibly(arg); 
  7.   } 

接著看Sync內的tryAcquireShared()方法,如果當前計數器的值為0,則返回1,最終將導致await()不會將線程阻塞。如果當前計數器的值不為0,則返回-1。

  1. protected int tryAcquireShared(int acquires) { 
  2.         return (getState() == 0) ? 1 : -1; 
  3.     } 

tryAcquireShared方法返回一個負值時,將會調用AQS中的

doAcquireSharedInterruptibly()方法,將調用await()方法的線程加入到阻塞隊列中,并將此線程掛起。

  1. private void doAcquireSharedInterruptibly(int arg) 
  2.       throws InterruptedException { 
  3.       //將當前線程構造成一個共享模式的節點,并加入到阻塞隊列中 
  4.       final Node node = addWaiter(Node.SHARED); 
  5.       boolean failed = true
  6.       try { 
  7.           for (;;) { 
  8.               final Node p = node.predecessor(); 
  9.               if (p == head) {         
  10.                   int r = tryAcquireShared(arg); 
  11.                   if (r >= 0) { 
  12.                       setHeadAndPropagate(node, r); 
  13.                       p.next = null; // help GC 
  14.                       failed = false
  15.                       return
  16.                   } 
  17.               } 
  18.               if (shouldParkAfterFailedAcquire(p, node) && 
  19.                   parkAndCheckInterrupt()) 
  20.                   throw new InterruptedException(); 
  21.           } 
  22.       } finally { 
  23.           if (failed) 
  24.               cancelAcquire(node); 
  25.       } 
  26.   } 

同樣,以上的代碼位于AQS中,在沒有了解AQS結構的情況下去理解上述代碼,有些困難,關于AQS源碼,會另開篇幅介紹。

使用場景

CountDownLatch的使用場景很廣泛,一般用于分頭做某些事,再匯總的情景。例如:

數據報表:當前的微服務架構十分流行,大多數項目都會被拆成若干的子服務,那么報表服務在進行統計時,需要向各個服務抽取數據。此時可以創建與服務數相同的線程數,交由線程池處理,每個線程去對應服務中抽取數據,注意需要在finally語句塊中進行countDown()操作。主線程調用await()阻塞,直到所有數據抽取成功,最后主線程再進行對數據的過濾組裝等,形成直觀的報表。

風險評估:客戶端的一個同步請求查詢用戶的風險等級,服務端收到請求后會請求多個子系統獲取數據,然后使用風險評估規則模型進行風險評估。如果使用單線程去完成這些操作,這個同步請求超時的可能性會很大,因為服務端請求多個子系統是依次排隊的,請求子系統獲取數據的時間是線性累加的。此時可以使用CountDownLatch,讓多個線程并發請求多個子系統,當獲取到多個子系統數據之后,再進行風險評估,這樣請求子系統獲取數據的時間就等于最耗時的那個請求的時間,可以大大減少處理時間。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-02-27 10:17:05

EventBus觀察者模式

2021-05-24 08:09:21

SentinelRedis 流控原理

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-06-09 09:08:10

LDOlowdropoutr穩壓器

2022-04-29 14:38:49

class文件結構分析

2021-07-21 09:48:20

etcd-wal模塊解析數據庫

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2023-03-29 07:45:58

VS編輯區編程工具

2021-04-14 14:16:58

HttpHttp協議網絡協議

2024-06-13 08:34:48

2022-02-17 08:53:38

ElasticSea集群部署

2022-03-22 09:09:17

HookReact前端

2021-06-21 14:36:46

Vite 前端工程化工具

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2021-07-08 07:30:13

Webpack 前端Tree shakin

2021-05-08 08:36:40

ObjectString前端

2023-03-13 09:31:04

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-04-23 08:59:35

ClickHouse集群搭建數據庫
點贊
收藏

51CTO技術棧公眾號

日本欧洲国产一区二区| 17婷婷久久www| 自拍一级黄色片| 爱福利在线视频| 91丨porny丨最新| 国产精品爱久久久久久久| 91香蕉视频在线播放| 加勒比久久高清| 欧美三级电影在线看| 成人国产在线看| 国产福利在线观看| 成人免费视频一区二区| 国产精品无码专区在线观看| 久久午夜无码鲁丝片午夜精品| 妖精视频一区二区三区| 欧美一区二区成人| 91淫黄看大片| 国产网站在线| 亚洲制服欧美中文字幕中文字幕| 视频在线观看成人| 亚洲色偷精品一区二区三区| 国产一区二区不卡| 国产精品久久久久福利| 国产一级特黄aaa大片| 国产精品88久久久久久| 亚洲欧美中文另类| 性欧美丰满熟妇xxxx性久久久| 在线视频成人| 在线观看国产一区二区| 国产精品50p| 色婷婷在线播放| 成人免费一区二区三区在线观看| 蜜桃视频成人| 天堂av手机版| 不卡电影一区二区三区| 粉嫩av免费一区二区三区| 在线观看xxxx| 免费的成人av| 国产精品福利网站| 97免费在线观看视频| 精品999成人| 欧美区二区三区| 小早川怜子一区二区的演员表| jiujiure精品视频播放| 日韩大片免费观看视频播放| 黑人玩弄人妻一区二区三区| 中文在线综合| 欧美一级片免费看| 日本特黄在线观看| 国产精久久久| 欧美一级淫片007| 韩国三级丰满少妇高潮| 高清一区二区| 日韩欧美一级二级三级| www.欧美com| aaa国产精品视频| 欧美本精品男人aⅴ天堂| 日本少妇一区二区三区| 亚洲精品18| 欧美变态tickling挠脚心| 91视频免费入口| 99久久香蕉| 精品视频久久久久久| 女人又爽又黄免费女仆| 成人高清电影网站| 久久伊人色综合| 日韩女优一区二区| 亚洲第一网站| 日本精品免费观看| 在线播放成人av| 国产精品自拍一区| 成人高清在线观看| 天天综合在线视频| 久久精品视频网| 亚洲欧美国产不卡| 欧美日韩xx| 亚洲图片欧美视频| 日韩在线xxx| 中文成人在线| 欧美精品一区视频| 在哪里可以看毛片| 一区二区电影| 国自产精品手机在线观看视频| 美日韩一二三区| 久久99精品久久只有精品| 99re在线视频观看| 亚洲激情图片小说视频| 黄色美女一级片| 95精品视频在线| 日韩福利一区二区三区| 免费在线视频欧美| 亚洲一区二区五区| 日本精品www| 国产情侣一区在线| 亚洲理论在线a中文字幕| 美国一级片在线观看| 伊人蜜桃色噜噜激情综合| 国产精品高潮在线| www.爱爱.com| 日本一区二区三区四区在线视频| 精品国产一区二区三区在线| 亚洲黄色网址| 欧美一区二区三区免费观看视频| 波多野结衣一本| 欧美午夜一区二区福利视频| 国产精品久久久久999| 乱精品一区字幕二区| 欧美国产日韩一二三区| 国产精品久久久久9999爆乳| 欧美激情不卡| 亚洲精选在线观看| 国产乡下妇女做爰毛片| 麻豆精品久久久| 久久综合九色99| 欧美人动性xxxxz0oz| 欧美视频一区二区在线观看| 日韩无码精品一区二区| 天天综合网91| 国产精品久久久久久av福利软件| 色欲av永久无码精品无码蜜桃| ㊣最新国产の精品bt伙计久久| 久久久久久久久久福利| 国产伦精品一区二区三区免费优势| 日韩中文字幕免费看| 无码人妻精品一区二区三区蜜桃91 | 欧美日韩色网| 91麻豆精品国产91久久久使用方法| 亚洲精品成人无码熟妇在线| 亚洲激情国产| 98国产高清一区| 国产黄色小视频在线| 欧美三级欧美一级| 久久久久亚洲av无码a片| 亚洲影院在线| 快播亚洲色图| 伊伊综合在线| 国产丝袜精品第一页| 91国产丝袜播放在线| 成人亚洲一区二区一| 精品人妻大屁股白浆无码| 精品视频一区二区三区| 久热精品视频在线| 99草在线视频| 亚洲精品欧美激情| 日本成人在线免费| 国内久久视频| 国语精品免费视频| av免费不卡国产观看| 亚洲第一区第二区| 九九热国产视频| 成人免费不卡视频| 免费观看美女裸体网站| 欧美电影在线观看免费| 欧美影院在线播放| 精品视频三区| 欧美日韩免费在线视频| 97成人资源站| 国产99久久久国产精品免费看| 老司机激情视频| 国产成人澳门| 日本成人激情视频| www亚洲人| 欧美一区二区三区思思人| 毛片a片免费观看| 99视频一区二区| 黄色片视频在线播放| 日韩欧美视频| 国产成人av一区二区三区| sm捆绑调教国产免费网站在线观看| 日韩高清有码在线| 日韩乱码一区二区三区| 亚洲天堂网中文字| 在线免费看黄色片| 三级一区在线视频先锋| 宅男一区二区三区| 国内精品偷拍| 国产成人精品一区二区三区| 免费在线观看黄色| 亚洲国产精品成人精品| 久久久久久无码午夜精品直播| 国产精品二三区| 国产一精品一aⅴ一免费| 久久久久久穴| 91嫩草国产丨精品入口麻豆| 奇米影视777在线欧美电影观看| 国产精品国产三级国产aⅴ浪潮| 麻豆传媒视频在线| 日韩av网址在线观看| 中文字幕一区二区三区免费看| 亚洲精品国产a久久久久久| 亚洲做受高潮无遮挡| 国产成人在线观看| 黄色三级视频片| 国模 一区 二区 三区| 日本一区网站| 97se亚洲| 国产日韩精品电影| 亚洲黄色免费看| 欧美第一淫aaasss性| 69视频在线| 亚洲精品美女久久久| 国产乱叫456在线| 色婷婷狠狠综合| 久久精品久久国产| ...av二区三区久久精品| 亚洲最大成人网站| 成人一道本在线| 在线观看日本www| 日本欧美久久久久免费播放网| 日本中文字幕在线视频观看 | 亚洲深夜福利在线| 亚洲精品国产手机| 在线成人av网站| 国产在线一级片| 精品av在线播放| 九九免费精品视频| 亚洲欧美偷拍另类a∨色屁股| 精品人伦一区二区三电影| 成人午夜碰碰视频| 四虎国产精品免费| 精品亚洲porn| 美女一区二区三区视频| 久久狠狠婷婷| 18岁网站在线观看| 精品动漫3d一区二区三区免费版 | 亚洲在线播放| 成人免费观看cn| 激情综合中文娱乐网| 91九色国产ts另类人妖| 欧美激情电影| 在线一区亚洲| 91精品一区二区三区综合在线爱| 日韩精品一区二区三区丰满| 国产精品一区2区3区| 精品久久一区二区三区蜜桃| 国产精品1luya在线播放| 91免费在线观看网站| 麻豆精品一区| 亚洲自拍欧美另类| 日韩欧美一级| dy888夜精品国产专区| 国产区一区二| 99久久无色码| 猫咪成人在线观看| 精品伊人久久大线蕉色首页| 久久99偷拍| 国产在线精品二区| 日韩精品社区| 秋霞毛片久久久久久久久| 国内成人自拍| 偷拍视频一区二区| 伊人久久大香线| 国产av熟女一区二区三区| 欧美视频导航| 国产二区视频在线播放| 久久国产精品亚洲77777| 黄色片在线免费| 精品一区二区三区香蕉蜜桃| 中文字幕中文在线| 国产精品原创巨作av| 自拍视频第一页| 97精品电影院| 欧美激情 一区| 亚洲欧美成aⅴ人在线观看| 久久久久免费看| 欧美日韩综合视频网址| 性高潮视频在线观看| 555www色欧美视频| 人妻无码中文字幕| 亚洲系列中文字幕| a级片国产精品自在拍在线播放| 欧美极品第一页| 中文字幕在线直播| 91精品国产综合久久久久久久久| 麻豆久久一区| 欧美一区观看| 夜间精品视频| 男女曰b免费视频| 国产一区欧美日韩| 亚洲黄色在线网站| 国产精品成人一区二区三区夜夜夜| 精品一区在线观看视频| 欧美日韩国产中文精品字幕自在自线| 亚洲成人av网址| 日韩欧美国产1| 国产成人天天5g影院在线观看 | 两个人看的在线视频www| 国产精品爱啪在线线免费观看 | 精品福利在线导航| 国产色在线 com| 欧美极品少妇xxxxⅹ免费视频| 日韩国产激情| 成人影片在线播放| 欧美理论视频| 成人午夜精品久久久久久久蜜臀| 日韩电影免费一区| 波多野结衣有码| 成人免费在线播放视频| 中文字幕高清在线免费播放| 日韩美女视频一区二区在线观看| 国模精品一区二区| 久久久久久久久综合| 日韩成人精品一区二区三区| 黑人另类av| 国产精品videosex极品| www.色欧美| 国产欧美视频在线观看| 亚洲精品77777| 日韩视频永久免费| 日本黄色片在线观看| 日本aⅴ大伊香蕉精品视频| 亚洲一二av| 97超碰免费观看| 热久久一区二区| 中文精品在线观看| 亚洲成av人片观看| 精品女同一区二区三区| 日韩在线小视频| 三上悠亚国产精品一区二区三区| 国产精品免费一区二区三区在线观看 | 加勒比海盗1在线观看免费国语版| 日韩专区在线视频| 在线免费观看a级片| 亚洲一区二区三区小说| 国产精品一级视频| 中文字幕亚洲欧美日韩在线不卡| 中文字幕在线视频久| 久久精品国产一区二区三区日韩 | 日韩精品导航| 美女日批免费视频| 成人免费高清在线| 国产亚洲精品久久久久久打不开| 欧美一区二区三区视频在线| 五月香视频在线观看| 国产精品久久久久9999| 欧美午夜精品一区二区三区电影| 日韩精品一区二区三区色欲av| 99久久精品国产网站| 国产无遮挡免费视频| 亚洲成人av在线播放| a√中文在线观看| 国产一区二区三区无遮挡| 伊人影院久久| 一级国产黄色片| 精品国产31久久久久久| 亚洲av成人精品一区二区三区在线播放| 久久久久久91香蕉国产| 国产成人高清精品免费5388| 久久久久久久久久久99| 99在线视频精品| 中文字幕国产在线观看| 亚洲网在线观看| 成人国产精品一区二区免费麻豆| 亚洲第一导航| 精品一区二区精品| 在线观看成人毛片| 亚洲第一区中文字幕| 538在线视频| 久久综合婷婷综合| 日韩制服丝袜先锋影音| 精品视频第一页| 日韩三级免费观看| 免费成人在线电影| 西游记1978| 国产一区二区按摩在线观看| 免费又黄又爽又色的视频| 亚洲激情自拍图| 欧洲av一区二区| 一级黄色片播放| 99视频有精品| 亚洲熟女乱色一区二区三区久久久 | 黄色片网站在线| 国产成人av一区二区三区| 久久久久久黄| 精品国产精品国产精品| 亚洲精品国产精品国自产观看浪潮| www.精品| 欧美一级中文字幕| 成人丝袜视频网| 国产情侣免费视频| 欧美另类99xxxxx| 亚洲区小说区图片区qvod| 久久撸在线视频| 亚洲成a人片在线不卡一二三区| 欧美日韩视频精品二区| 91在线免费观看网站| 午夜宅男久久久| 手机在线免费看片| 亚洲欧美色图片| 日韩欧美一级| 日本激情视频在线播放| 亚洲国产成人va在线观看天堂| 国产在线免费观看| 97超碰在线播放| 青青草一区二区三区| 国产大片中文字幕| 久久精品电影一区二区| 亚洲妇女av| 国偷自产av一区二区三区麻豆| 在线观看视频一区|