Java --併發--繼續 第五彈--閉鎖

閉鎖:延遲線程的進度,直到其到達終止狀態算法

1:就像是一道門初始狀態大門一直是關閉的,在達到結束狀態以前,這扇門將會打開,此時容許全部的線程經過,達到結束狀態後將不會再改變,數據庫

做用:確保某些活動直到其它活動都執行完畢後再執行安全

 例如: 1確保某個計算在須要的資源被初始化以後再執行,此時叫作二元閉鎖ui

 2:確保某個服務在其依賴的服務啓動完成以後再啓動spa

 

Future:,也是一種閉鎖的實現方式,表示一種可生成抽象結果的運算, FutureTask表示的計算是經過callable實現的,表示一種可生成結果的Runnable線程


處於三種狀態:等待運行,正在運行,運行完成對象

Future.get//的行爲取決於任務的狀態,若是任務已經完成,那麼get會當即返回,若是任務還未完成,get會一直阻塞,直到任務完成,或者拋出異常,索引

futureTask將執行計算的結果,從一個當前線程傳遞另外一個線程是線程安全的事件



CountingSemaphore計數信號量:用來控制某個特定資源的操做數量或者同時執行某個操做的數量資源

1:acquire將獲取一個許可,若是此時沒有足夠的許可,那麼此時

2:release將返回一個許可,給信號量

具有不可重入的加鎖語意,誰擁有許可,誰就擁有了這個互斥鎖


例如數據庫鏈接池就是一種經常使用的用法,數據庫鏈接池,當池中非空的時候,將能夠得到鏈接,當池中爲空時,此時請求資源會失敗,此時但願看到的是阻塞,當release釋放許可給信號量的時候

此時但願可以得到鏈接池。咱們可使用Semaphore,將任何一種容器變爲有界容器,

閉鎖是一次性對象,一旦進入就不能被重置


cycleBarrier:線程必須同時到達柵欄位置,才能繼續執行,柵欄相似於閉鎖他能阻塞一組線程直到等待事件發生,柵欄與閉鎖的根本區別在於:柵欄用於等待一組線程,而閉鎖用於等待一組事件

柵欄用於實現一些協議,例如幾個家庭決定在某個地方集合,使參與數量的一方反覆的在柵欄位置聚集,並行迭代算法中很是有用,這種算法一般將一個問題拆分紅一系列的子問題,當線程到達時將

調用await方法,這個方法將阻塞全部線程到達柵欄位置,直到全部的線程都到達,此時柵欄將會打開,弱國線程被打斷,此時全部的阻塞將會失效成功,此時await將會爲每一個線程分配一個索引號

咱們能夠利用這個索引來產生一個領導線程,並利用這個領導線程在下個迭代中,執行以一些特殊的工做。

相關文章
相關標籤/搜索