【JUC】CountDownLatch

因為在調用端的異步中,需要調用其他多個服務獲取數據再匯總結果返回,所以用到了CountDownLatch

CountDownLatch的概念

CountDownLatch是一個同步工具類,用來協調多個線程之間的同步,或者說起到線程之間的通信(而不是用作互斥的作用)。

CountDownLatch能夠使一個線程在等待另外一些線程完成各自工作之后,再繼續執行。使用一個計數器進行實現。計數器初始值為線程的數量。當每一個線程完成自己任務后,計數器的值就會減一。當計數器的值為0時,表示所有的線程都已經完成了任務,然后在CountDownLatch上等待的線程就可以恢復執行任務。

CountDownLatch的用法

CountDownLatch典型用法1:某一線程在開始運行前等待n個線程執行完畢。將CountDownLatch的計數器初始化為n new CountDownLatch(n) ,每當一個任務線程執行完畢,就將計數器減1 countdownlatch.countDown(),當計數器的值變為0時,在CountDownLatch上 await() 的線程就會被喚醒。一個典型應用場景就是啟動一個服務時,主線程需要等待多個組件加載完畢,之后再繼續執行。

CountDownLatch典型用法2:實現多個線程開始執行任務的最大并行性。注意是并行性,不是并發,強調的是多個線程在某一時刻同時開始執行。類似于賽跑,將多個線程放到起點,等待發令槍響,然后同時開跑。做法是初始化一個共享的CountDownLatch(1),將其計數器初始化為1,多個線程在開始執行任務前首先 coundownlatch.await(),當主線程調用 countDown() 時,計數器變為0,多個線程同時被喚醒。

CountDownLatch的不足

CountDownLatch是一次性的,計數器的值只能在構造方法中初始化一次,之后沒有任何機制再次對其設置值,當CountDownLatch使用完畢后,它不能再次被使用。

?

CountDownLatch使用案例

需求:解析一個文件下多個txt文件數據,可以考慮使用多線程并行解析以提高解析效率。每一個線程解析一個文件里的數據,等到所有數據解析完畢之后再進行其他操作。

設計分析:在這個需求中,需要實現主線程等待所有線程完成文件解析操作,CountDownLatch正好可以做到。

CountDownLatch源碼分析

CountDownLatch是自定義AQS同步組件,是AQS的一個非常簡單的實現,接下來就以自定義同步器Sync、countDown方法和await方法為切入點,分析CountDownLatch的具體實現。

  • 自定義同步器Sync實現[s??k]

    自定義同步器實現

    同步器Sync實現了共享式獲取同步狀態的acquire和release,前文中已經詳細介紹過AQS相關內容,在這里我就不再做詳細介紹分析了。

  • 構造方法


    構造方法

    從構造方法的具體實現可以看出,通過構造方法傳入的int型參數count其實就是同步器的狀態State

  • countDown實現

    countDown實現

    整個countDown只做了一件事情,釋放同步狀態,同步狀態在這里的實際意義也就是需要等待的完成的點的數量,只要每完成一個點,就調用countDown方法釋放同步狀態。

  • await實現
    CountDownLatch提供帶超時時間的await和不帶超時時間的await:

    await實現

    await的實質是在獲取同步狀態,同步狀態state == 0成立,當前等待完成的點均已完成,主線程繼續往下執行否則,主線程進入等待隊列自旋等待直到同步狀態釋放后state == 0。有些時候主線程是不能一直自旋等待,這個時候帶超時時間的await就派上用場了,設置超時時間,如果在指定時間內N個點都未完成,返回false,主線程不再等待,繼續往下執行。

參考AQS結構圖方便理解:

?

總結:CountDownLatch實質上就是一個AQS計數器,通過AQS來實現線程的等待與喚醒。



鏈接:https://www.jianshu.com/p/bce9f156080f

https://blog.csdn.net/joenqc/article/details/76794356

轉載于:https://www.cnblogs.com/twoheads/p/9554645.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250811.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250811.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250811.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

node --- Missing write access to 解決

今天在使用npm安裝animate.css時報錯… 大體原因是沒有對node_modules沒有寫的權限. 百度查到是要刪除對應的node_modules然后在安裝… 但是我并不想這樣做…想起前面我為了加快下載速度,好像使用的是cnpm… 于是我使用了nrm ls 查看當前使用的源 更換npm的源可以參考 https:…

3 useReducer及其實現

pureComponent import { useState } from "react" // useReducer, // 統一調度 function reducer(state, action) {console.log(reducer接收參數, state, action)const { type } actionswitch (type) {case add:return { num: state.num 1 }case minus:return { n…

Django 之 權限系統(組件)

參考: http://www.cnblogs.com/yuanchenqi/articles/7609586.html 轉載于:https://www.cnblogs.com/bigtreei/p/8564243.html

vue踩坑- 報錯npm ERR! cb() never called!

在vue項目中引入餓了么elementUI組件的步驟之中&#xff0c;出現以下的錯誤&#xff1a; D:\my-project-first>npm i element-ui -S Unhandled rejection RangeError: Maximum call stack size exceededill install loadIdealTreeat RegExp.test (<anonymous>)at D:\n…

maven之阿里云Maven鏡像的使用

Maven中央倉庫在國外&#xff0c;速度比較慢&#xff0c;所以我們采用國內的鏡像&#xff0c;速度回有質的提升。 配置下setting.xml <mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/ne…

vue --- 使用animate.css實現動畫

1.下載animate.css npm install --save-dev animate.css// 注意你使用的源 nrm ls(若沒有改變可以忽略)2.導入animate.css <link rel"stylesheet" href"../node_modules/animate.css/animate.css"> // 注意你的當前文件和node_moudules文件夾的相對…

4 contextHook

類組件createContext、靜態屬性contextType 與函數組件useContext 的對比 import { Component, createContext, useContext } from react const AppContext createContext(0) class Foo extends Component {render() {return (<AppContext.Consumer>{value > (Foo: …

【leetcode 簡單】 第一百一十題 分發餅干

假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。對每個孩子 i &#xff0c;都有一個胃口值 gi &#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅干 j &#xff0c;都有一個尺寸 sj 。…

基于openstack搭建百萬級并發負載均衡器的解決方案

最近&#xff0c;喜歡研究一些國外技術大咖們的文章&#xff0c;而這篇文章是基于openstack負載均衡器的解決方案&#xff0c;做的一些總結~希望能夠給小伙伴帶來一些靈感或者幫助。 openstack現有的負載均衡解決方案&#xff0c;無論是lbaas plugin還是octavia&#xff0c;后端…

5 useMemouseCallback

useMemo 優化渲染 現象 App每次重新執行時&#xff0c;render變化了&#xff0c;引用的render不是同一個函數 import React, { useState, } from "react"; const Foo props > {return <ul>{props.render()}</ul> } function App() {const [range…

vue --- 動畫執行的周期(動畫的鉤子函數)

如下8個: <transitionv-on:before-enter "beforeEnter"v-on:enter "enter"v-on:after-enter "afterEnter"v-on:enter-cancelled "enterCancelled"v-on:before-leave "beforeLeave"v-on:leave "leave"v-…

二分查找c++

相信對于二分查找的原理大家已經明白&#xff0c;接下來就是代碼實現了 1 #include <iostream>2 #include <cstdio>3 #include <algorithm>4 #include <cstring>5 #include <string>6 #include <cstdlib>7 8 using namespace std;9 10 in…

php獲取網址

1 #測試網址: http://localhost/blog/testurl.php?id52 3 //獲取域名或主機地址 4 echo $_SERVER[HTTP_HOST]."<br>"; #localhost5 6 //獲取網頁地址 7 echo $_SERVER[PHP_SELF]."<br>"; #/blog/testurl.php8 9 //獲取網址參數 10 echo …

6 useRef、useImperativeHandle

useRef在每次執行時返回的是同一個引用&#xff08;返回的ref對象在組件的整個生命周期內保持不變&#xff09;在函數組件中可以使用useRef和createRef但useRef性能比createRef好&#xff0c;快在類組件中&#xff0c;createRef是在初始化constructor時被賦值的&#xff08;執行…

vue --- 列表(v-for渲染)的各種神仙動畫效果

通過v-for生成的元素,使用transition包裹將只顯示第一條數據,此時需要使用transition-group包裹. <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

linux命令目錄

一、文件和目錄。&#xff08;文件目錄的增刪改查&#xff09; lspwdcdmkdirtouchrmdirlnddrmcpmvnlcattacmorelessheadtailstat###########################################grepawksed findlocatewhichwhereiswc ############################################dfdumountumoun…

vue --- 使用component的 :is屬性切換標簽頁

點擊對應的標簽,下面切換至對應的模板… // 說明 <component :is"name"></component> // 相當于把id為name的組件放到對應的位置總體代碼如下: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

3-15 《元編程》第6章 3-16 hook method

Code That Writes Code 6.1 Coding your way to the weekend 6.2 Kernel#eval, Binding#eval Binding: Objects of class Binding(類Binding的對象) encapsulate &#xff08;密封&#xff09;the execution context at some particular place in the code and retain this c…

7 useLayoutEffect、useDebugValue

useEffect&#xff1a;dom完成渲染后執行 不傳參數&#xff0c;每次都會執行 傳空的依賴[]&#xff0c;只會執行一次 有依賴&#xff0c;依賴項變化會執行 useEffect實現動畫效果 import { useEffect, useRef, useState } from "react"const App () > {const [,…

【Linux】用戶與權限

追加用戶組 groupadd 用戶組名 追加新用戶 useradd -d 指定用戶目錄 -s 指定用戶使用shell -g 指定用戶組 -p 指定用戶密碼 用戶名 更改用戶 添加用戶到其他組 usermod -G 用戶組 用戶名 修改用戶密碼 passwd 用戶名 刪除用戶 userdel [參數] 用戶名參數&#xff1a;-f&#x…