java - 我们是否需要让 ConcurrentHashMap 变得易变?

标签 java concurrency java.util.concurrent

我们有一个共享的 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 那么是的,你需要使它成为 volatilevolatile 适用于字段分配,如果不是对另一个线程可见。重申一下,这是 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 本身的变异方法(如 putremove)完成的,则使字段 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/

相关文章:

java - 使用 Java future 进行无限操作是错误的吗?

java - ReadWriteLock 需要 ConcurrentHashMap 吗?

java - Maven:为什么父pom中声明的依赖项不被子pom继承?

java - 由于 JAR 冲突而无法运行 Flume

java - 使用 Java 的 struts2 中的浏览器区域设置

Java的ExecutorService性能

类之间的 Java 共享条件抛出 IllegalMonitorStateException : null

java - Java 中的 boolean 信号量

java - Spring MVC Portlet 操作映射不起作用

java - 解决Java中链表的手动锁定死锁问题