1 java 併發工具 2 通俗理解 3 CountDownLatch 4 等ABCD 4我的都結束了,本身才能開始,結束一個減一個 5 CyclicBarrier 6 我和A,B,C,D 5我的互相等待,會合了再一塊兒進電影院,到一個減一個 7 Semaphore 8 計數器,雞蛋籃子裏只能放5個雞蛋,缺幾個,才能放幾個 9 Exchanger 10 A和B交換數據 11 CountDownLatch 12 CountDownLatch 它容許一個或多個線程等待其餘N個指定數量線程完成操做 13 CountDownLatch也能夠實現join的功能,而且比join的功能更多 14 AQS(隊列同步器) 共享鎖 15 內部類 16 sync爲CountDownLatch的一個內部類,而Sync繼承AQS。 17 採用共享鎖來實現的。 18 重要操做 19 CountDownLatch(int count) 20 構造一個用給定計數初始化的 CountDownLatch,count爲計數器的初始值,也能夠理解爲該共享鎖能夠獲取的總次數。 21 await() 22 使當前線程在鎖存器倒計數至零以前一直等待,除非線程被中斷 23 awit(long time, TimeUnit unit) 24 帶指定時間的await方法,這個方法在等待特定時間以後,就不會阻塞當前線程。 25 countDown() 26 遞減鎖存器的計數,若是計數到達零,則釋放全部等待的線程。 27 一個線程調用countDown方法 happen-before 另一個線程調用 await 方法 28 注意CountDownLatch不能回滾重置。 29 CyclicBarrier 30 定義 31 可循環使用的同步屏障:它容許一組線程互相等待,直到達到某個公共屏障點(common barrier point) 32 通俗講:讓一組線程到達一個屏障是被阻塞,直到最後一個線程到達屏障時,屏障纔會開門,全部被屏障攔截的線程纔會繼續幹活 33 底層採用ReentrantLock + Condition 實現 34 重要操做 35 兩個構造函數 36 CyclicBarrier(int parties):parties表示屏障攔截的線程數量(插入的屏障數),每一個線程調用await方法告訴CyclicBarrier已經到達了屏障,而後當前線程被阻塞。 37 CyclicBarrier(int parties, Runnable barrierAction) :用於在線程到達屏障前,優先執行barrierAction,方便處理更復雜的業務場景 38 其餘方法 39 getNumberWaiting 40 得到CyclicBarrier阻塞的線程數量 41 isBrocken 42 瞭解阻塞的線程是否被中斷 43 await() 44 插入屏障,到達了屏障,本質上至關於屏障數-1 45 應用場景 46 多線程結果合併的操做,用於多線程計算數據,最後合併計算結果的應用場景 47 CyclicBarrier V.S. CountDownLatch 48 CountDownLatch的做用是容許1個或N個線程等待其餘線程完成執行; 49 CyclicBarrier則是容許N各線程互相等待 50 CountDownLatch的計數器沒法被重置,只能使用一次若是須要重置計數,請考慮使用CyclicBarrier. 51 CyclicBarrier的計數器能夠被reset重置後使用,所以它被稱爲是循環的barrier,能處理更爲複雜的業務場景。例如計算髮生錯誤,能夠重置計數器,並讓線程從新執行一次 52 Semaphore 53 信號量 54 計數器,用來控制同時訪問特定資源的線程數量,他經過協調各個線程,以保證合理的使用公共資源 55 內部採用共享鎖實現 56 信號量Semaphore是一個非負數(>=1)。當一個線程想要訪問某個共享資源時,它必需要先獲取Semaphore,當Semaphore>0 時,獲取該資源並使 Semaphore-1. 若是Semaphore=0,則表示所有的共享資源已經被其餘線程所有佔用,線程必需要等待其餘線程釋放資源。當線程釋放資源時,Semaphore+1。 57 從概念上講,信號量維護了一個許可集。若有必要,在許可可用前會阻塞每個acquire(),而後再獲取該許可。每一個release()添加一個許可,從而可能釋放一個正在阻塞的獲取者。可是,不使用實際的許可對象,Semaphore只對許可的號碼進行計數,並採起相應的行動。 58 重要操做 59 Semaphore(int permits) 60 構造函數,接受一個整型的數字,表示可用的許可證數量,也就是最大的併發量 61 acquire 62 獲取一個許可證 63 tryAcquire 64 嘗試獲取一個許可證 65 release 66 歸還許可證 67 int availablePermits() 68 返回此信號量中當前可用的許可證數 69 int getQueueLength() 70 返回正在等待獲取許可證的線程數 71 boolean hasQueuedThreads() 72 是否有線程正在等待獲取許可證 73 void reducePermits(int reduction) 74 減小reduction個許可證 75 Collection getQueuedThreads() 76 返回全部等待獲取許可證的線程集合 77 應用場景 78 用於流量控制,特別是公用資源有限的應用場景,好比數據庫鏈接。 79 Exchanger 80 定義 81 交換者,是一個用於線程間協做的工具類,用於進行線程間的數據交換,兩個線程 82 它提供一個同步點,用於進行線程間成對配對及交換數據, 83 具體 84 第一個線程先執行exchange()方法,它會一隻等待第二個線程也執行exchange()方法,當兩個線程都到達同步點時,兩個線程就能夠交換數據,將本線程生產出來的數據傳遞給對方 85 容許在併發任務之間交換數據。具體來講,Exchanger類容許在兩個線程之間定義同步點。當兩個線程都到達同步點時,他們交換數據結構,所以第一個線程的數據結構進入到第二個線程中,第二個線程的數據結構進入到第一個線程中 86 應用場景 87 遺傳算法 88 交叉 89 校對工做 90 AB崗錄入電子銀行流水 91 Exchanger 可能被視爲 SynchronousQueue 的雙向形式。Exchanger 可能在應用程序(好比遺傳算法和管道設計)中頗有用。