像使用同步关键字时一样,在 CyclicBarrier 或 CountDownLatch 上进行缓存刷新

Mat*_*mes 2 java multithreading cpu-cache

有没有什么方法可以确保java刷新在CyclicBarrier或CountDownLatch允许我们继续(就像synchronized关键字一样)之前已经完成的写入的缓存,而不使用synchronized关键字?

irr*_*ble 5

我认为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
Run Code Online (Sandbox Code Playgroud)

不需要额外的同步;read x2将会看到结果write x2