java - 并发 HashMap java

标签 java concurrency

这似乎是错误的。

        static ConcurrentHashMap k; //multiple threads have access to k
         X o = k.get("LL");
         o.a = 6;

如果多个线程并发访问 k,并获取 k("LL"),则不使用 k.put("ll",o) 更新 (o.a = #),不在 'o' 或 'k' 上同步会发生什么?

最佳答案

ConcurrentMap 具有保证原子插入/删除和替换键/值对的条件操作。此外,访问 ConcurrentMap 会创建一个 happens-before关系,以便您可以对代码的顺序做出某些保证。

在提供的代码中,行:

X o = k.get("LL");

访问键“LL”的当前 X 值。下一行修改 a 属性。不知道 X 的实现,这是 Java,所以我们知道这里没有方法调用。 如果(且仅当)a 属性被标记为 volatile,那么在“LL”处访问 X 的一些后续代码会将 a 值视为 6。如果它不是 volatile,则无法保证根本。他们可能会看到 6,特别是在 SMP x86 机器上,当时没有多少线程做很多事情。在生产中,在一个大的 NUMA 盒子上,他们不太可能这样做。可变性带来了各种复杂性和困难。

通常,如果您使用不可变的键和值,您会发现更容易推断出 map 所处的状态。

关于java - 并发 HashMap java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13215264/

相关文章:

java - 这个单例对序列化和反射攻击都有抵抗力吗?

java - 如果链中的第一个方法是异步的,则方法调用链(CompletableFuture API)是否会异步执行?

java - 通知客户端中的线程,该线程是在服务器中的 wait() 上发送的

java - 加快 Java 中的 Ignite 启动速度

java - 当没有控制台时,Java 是否为 System.out.println(...) 运行任何东西?

java - 如何配置 PostgreSQL 以允许 TCP/IP 连接?

java - 如何检测用户是否启用了自动亮度?

java - 如何通过Spring Boot获取mongoDB中的计数?

c# - Nancy 并发请求同步运行

java - 为什么 Java Executors 类没有提供调度的缓存线程池?