併發工具類:
lk最近學習了併發工具類的知識,總結一下它們的用法:
1.countdownlatch
2.cyclicbarrier
3.semaphore
4.exchanger
使用完countdownlatch之後,覺得它適合應用於讓其它執行緒去各自執行完,然後main執行緒開始執行的場合 。
自己理解的原理圖:
具體應用場景:
/**
* 使用場景 主線程等待其它執行緒執行完畢在執行
* * @author yrz
* */
public
class
mycountdownlatch})
.start()
;new
thread
(new
runnable()
}).start()
;try
catch
(interruptedexception e)
}}
當我們呼叫一次countdownlatch的countdown方法時,n就會減1,countdownlatch的await會阻塞當前執行緒,直到n變成零。
n為阻塞的執行緒數(本例中指 2)
簡介:cyclicbarrier 的字面意思是可迴圈使用(cyclic)的屏障(barrier)。它要做的事情是,讓一組執行緒到達乙個屏障(也可以叫同步點)時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續幹活==。cyclicbarrier預設的構造方法是cyclicbarrier(int parties),其引數表示屏障攔截的執行緒數量,每個執行緒呼叫await方法告訴cyclicbarrier我已經到達了屏障,然後當前執行緒被阻塞。
總結:所有執行緒到達屏障後,才會繼續幹活
自己理解的原理圖:
應用場景:等待參會成員到會後,開始開會
/**
* 同步屏障cyclicbarrier
* @author yrz
* */
public
class
mycyclicbarrier
catch
(exception e)
}public
static
void
main
(string[
] args)})
;for
(int i =
0; i <
5; i++)}
).start()
;;}}
}
cyclicbarrier的await方法會阻塞到達屏障的執行緒,當最後乙個執行緒到達後,執行barrieraction。
訊號量作用:控制併發執行緒,自己理解的原理圖
* 控制併發執行緒數semaphore
* @author yrz
* */
public
class
mysemaphore
catch
(exception e)}}
);} executorservice.
shutdown();}}
訊號量像乙個水閘,semaphor的建構函式預設限制值,這個值就像水閘的寬度一樣,限制允許通過的水流量(也就是執行緒數量)。semaphore.acquire()方法獲取許可,semaphore.release()方法釋放許可。
exchanger 兩個執行緒進行資料交換,主要是使用exchanger.exchange()方法,比較兩個執行緒的值是否相等。自己理解的原理圖:
* 兩個執行緒進行資料交換的exchanger
* * @author yrz
* */
public
class
myexchanger
catch
(interruptedexception e)}}
);executorservice.
execute
(new
runnable()
}catch
(interruptedexception e)}}
);}}
java併發程式設計的藝術(六) AQS
aqs是佇列同步器 abstractqueuesynchronizer 是用來構建鎖和完成其他同步元件的基本框架,再lock裡面,很多的方法都將用到aqs以獲取同步狀態,實現鎖的語義,而不是依靠傳統的synchronized中的物件進行鎖獲取與釋放。aqs的核心思想是基於volatile int s...
JAVA併發程式設計
通過常量字串 string 來呼叫 wait 或 notify 方法所導致的問題是,jvm 編譯器會在內部自動將內容相同的 string 轉變為相同的物件。這意味著,即便你建立了兩個不同的 mywaitnotify 例項,他們內部的 mymonitorobject 變數也會指向相同的 string ...
Java併發程式設計
執行緒之間通訊 1.加鎖 object.wait 釋放鎖 object.notify 與sychronized 聯合使用,object lock new object sychronized lock sychronized lock 2.改進 無需加鎖並發包下 countdownlatch.awa...