使用synchronized关键字时,在CyclicBarrier或CountDownLatch上缓存刷新

时间:2011-09-20 23:56:06

标签: java multithreading cpu-cache

有没有办法确保java刷新在CyclicBarrier或CountDownLatch允许我们继续(如synchronized关键字所做的那样)之前完成的写入缓存而不使用synchronized关键字?

1 个答案:

答案 0 :(得分: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 之前的操作发生在屏障操作执行的操作之前,屏障操作执行的操作发生在成功返回之后的操作之前来自其他线程中的相应await。


这意味着

thread 1                  thread 2

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

无需额外同步; read x2会看到write x2

的结果