原子变量是否保证“在关系之前发生”?

V16*_*666 0 java concurrency java-memory-model compare-and-swap

我有一个要求,我需要在完成后发布“n”个线程的结果。为了检查所有线程是否已完成,我使用了 AtomicInteger (incrementAndGet()) 并将其值与最终变量进行比较。在进行检查之前,我将各个线程的结果写入共享对象(写入并发散列图,因为非同步数据结构 dint 似乎就足够了)。所以,我的问题是,在我的计数器通过“if”条件之前,所有线程是否会完成对共享对象的写入(并且主线程是否能够看到一致的内存)?

这是示例代码:

公共无效运行(){

    //Values is a concurrent hashMap. 
    values.put(Thread.currentThread().getName(), Thread.currentThread().getName());

    if(counter.incrementAndGet() == 5) {
        //Do something
    }
}
Run Code Online (Sandbox Code Playgroud)

shm*_*sel 5

包总结java.util.concurrent.atomic

原子的访问和更新的内存效应通常遵循 volatiles 的规则,如The Java Language Specification (17.4 Memory Model) 中所述

  • get具有读取volatile变量的记忆效应。
  • set具有写入(分配)volatile变量的记忆效应。
  • [..]
  • compareAndSet 以及所有其他读取和更新操作(例如 getAndIncrement)都具有读取和写入 volatile 变量的记忆效应。

incrementAndGet()包括 set 和 get 操作,这意味着你确实有一个完整的发生在边缘。