2011-09-20 18 views

回答

3

我覺得它已經由API保證。

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CyclicBarrier.html

內存一致性效果:在一個線程操作之前調用AWAIT()發生-之前是阻擋作用的部分,而這又發生-之前以下成功返回動作動作從其他線程中的相應await()中獲取。

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

由一個線程寫入的結果保證是一個僅當寫入操作之前發生讀操作另一個線程讀取可見。 ...由阻隔作用執行之前調用CyclicBarrier.await 發生,之前的屏障作用進行動作動作和動作發生,之前行動隨後從相應的等待其他線程成功返回。


這意味着

thread 1     thread 2 

write x1;     write x2 
barrier.await();   barrier.await(); 
read x2     read x1 

不需要額外的同步; read x2將看到結果write x2

+0

是的,這保證了操作順序,但我沒有看到任何文字提到刷新緩存值到內存(以便等待的線程肯定會看到對方的結果) - 我的觀點是如果volatile關鍵字是必需的,以確保寫入的值將在所有等待線程剛走到低谷的屏障 –

+0

被共享的*發生,之前*這裏是一個技術術語;如果'*發生,之前*寫x2''讀x2',讀會看到寫的效果。你可以認爲這是'緩存沖洗';雖然Java的內存模型不再使用緩存/齊平的概念。 – irreputable