java中的同步hashmap写入但不读取

jer*_*mie 5 java concurrency multithreading hashmap

我知道 Java 中的 ConcurrentHashMap 及其众多优点,但我不太清楚为什么像同步 HashMap 这样的实现需要在每个函数调用上同步。

对我来说,感觉就像如果你有一个 HashMap ,其唯一的功能是put(k, v)get(k),那么只有该put函数需要同步,因为即使你在调用后调整 hashMap 的大小put,那么你仍然可以在执行时授予安全的读取访问权限调整大小。读取器线程可以简单地读取调整大小之前的版本。当调整大小完成后,编写器线程将替换引用,以便所有当前调用都get将指向 HashMap 的调整大小版本。

我错过了一些明显的东西吗?

mic*_*hid 1

您所描述的是一种用于读取的快照语义。鉴于映射的底层实现确实支持此类语义,则无需同步读取访问。但是,您不能假设这适用于任何地图实现。

具体来说:映射可能选择通过单独的链接来实现其存储桶。在这种情况下,当不同步读取访问时,您可能最终会从其列表正在更新的存储桶中读取数据。在最坏的情况下,当底层列表实现为链表时,这种不同步的访问甚至可能导致读取线程陷入无限循环。