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)
见包总结为java.util.concurrent.atomic:
原子的访问和更新的内存效应通常遵循 volatiles 的规则,如The Java Language Specification (17.4 Memory Model) 中所述:
get具有读取volatile变量的记忆效应。set具有写入(分配)volatile变量的记忆效应。- [..]
compareAndSet以及所有其他读取和更新操作(例如 getAndIncrement)都具有读取和写入 volatile 变量的记忆效应。
incrementAndGet()包括 set 和 get 操作,这意味着你确实有一个完整的发生在边缘。
| 归档时间: |
|
| 查看次数: |
751 次 |
| 最近记录: |