我们有一个共享的 ConcurrentHashMap
,它被 2 个线程读写。
class Test {
private ConcurrentHashMap<Object, Object> map = new ConcurrentHashMap<>();
Object read() {
return map.get(object);
}
void write(Object key, Object object) {
map.put(key, object);
}
}
我们是否需要使映射可变,以便读取线程尽快看到一个线程的写入?
是否有可能在一个线程中放置到 map 后,另一个线程看不到或很晚才看到?
HashMap
的问题相同。
最佳答案
如果你能做到 final
那就去做吧。如果你不能使它成为 final
那么是的,你需要使它成为 volatile
。 volatile
适用于字段分配,如果不是对另一个线程可见。重申一下,这是 ConcurrentHashMap
字段分配,而不是使用 CHM。
话虽如此,你真的应该把它final
。
Do we need to make the map volatile so that writes of one thread are seen by the reader threads as soon as possible?
如果您所说的写入是使用 CHM 本身的变异方法(如 put
或 remove
)完成的,则使字段 volatile 没有效果.所有内存可见性保证都在 CHM 内完成。
Is it possible that a put to the map in one thread is not seen or seen very late by a different thread? Same question for
HashMap
.
不适用于 ConcurrentHashMap
。如果您同时使用普通的 HashMap
,请不要这样做。见:http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html
关于java - 我们是否需要让 ConcurrentHashMap 变得易变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29404851/