2015-06-06 68 views
0

我想使用一個CyclicBarrier對象作爲靜態成員,我有多線程正在修改CyclicBarrier對象狀態,這樣做是否安全?CyclicBarrier線程安全嗎?

+0

爲什麼你有懷疑? –

+0

我無法在網上找到確保線程安全的東西,如果兩個線程同時嘗試更改狀態,它會永久等待嗎? –

+0

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CyclicBarrier.html –

回答

1

的Javadoc說:

內存一致性效果:調用的await()在成功是屏障操作的一部分發生之前,行動,進而發生,之前的行動在一個線程操作之前,從其他線程中的相應await()返回。

和其他一些事情。

所以是...它是線程安全的。


1 - Javadoc中不使用的話 「線程安全的」。但是,我認爲這是因爲線程安全是一個棘手的概念。我所看到的定義有效地說,如果有多個線程,如果它是正確的(根據規範工作),則某些內容是「線程安全的」。如果你簡單地說X是「線程安全的」,它會引發一個問題:指定的行爲是什麼? 「正確」是什麼意思? javadoc通過簡單地聲明關鍵同步屬性...來避開這個問題......這是由JLS定義的一個非常精確的術語。

爲什麼我要提出這個問題?要指出的是,僅僅要求「是X線程安全的?」是膚淺的,容易引導你陷入問題......如果這是你分析的全部範圍。

6

CyclicBarrier整點是爲了同步多個線程。改變狀態的唯一方法是await(有和沒有超時)和reset,這些方法的文檔清楚地描述了它們如何與其他線程交互。

是的,它是線程安全的。