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

标签 java multithreading cpu-cache

是否有某种方法可以确保 java 刷新在 CyclicBarrier 或 CountDownLatch 允许我们继续(如同步关键字所做的那样)之前已完成的写入的缓存,而无需使用同步关键字?

最佳答案

我认为 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 屏障操作执行的 happen-before 操作之前的操作,以及成功返回之后屏障操作 happen-before 操作执行的操作来自其他线程中相应的等待。


这意味着

thread 1                  thread 2

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

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

关于java - 像使用同步关键字时一样,在 CyclicBarrier 或 CountDownLatch 上进行缓存刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7493140/

相关文章:

java - Java 中 boolean 动词的变量和方法命名约定?

java - 从 Groovy Sql 调用函数

java - 我什么时候将内存使用量加倍?

java - NumberFormatter 的行为不符合预期

multithreading - Lock Less Key Value 数据结构

cpu-cache - 刷新 CPU 缓存时缓存步幅的作用

Python OpenCV 线程

c# - 在VS的 Debug模式下使用netcore 3.1时,线程无序地排队

performance - 多核 Intel CPU 中的高速缓存是如何共享的?

c - cpu 会将 STORE 指令重新排序到同一地址吗?