2

是否有某种方法可以确保 java 刷新在 CyclicBarrier 或 CountDownLatch 允许我们在不使用 synchronized 关键字的情况下继续(如 synchronized 关键字一样)之前完成的写入缓存?

4

1 回答 1

4

我认为 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

于 2011-09-21T00:05:44.400 回答