让我们假设“键”永远不会重叠,但对于应用程序来说是唯一的。换句话说,每个 put 都将never
被调用相同的键。在这种情况下 :
map.put 是否需要同步?
如果是,那么如何?
例如,假设<Name, Id>
在一个虚构的世界中,每个人的名字都是唯一的。在这样的应用程序中,我需要同步 map put 吗?
让我们假设“键”永远不会重叠,但对于应用程序来说是唯一的。换句话说,每个 put 都将never
被调用相同的键。在这种情况下 :
map.put 是否需要同步?
如果是,那么如何?
例如,假设<Name, Id>
在一个虚构的世界中,每个人的名字都是唯一的。在这样的应用程序中,我需要同步 map put 吗?
是的。例如:put()
新键上的 a 可能导致resize()
地图上的 a - 两个同时resize()
调用可能导致数据结构的内部变得不一致。不一致可能意味着诸如(实际见证)导致后续调用put()
无限循环,因为它使内部引用不一致并创建了一个循环。
您绝对需要使用同步,即使使用唯一键,除非您 100% 保证底层 Map 实现是并发的。
例如,如果您尝试和误用具有同步功能的标准 HashMap,则可能会发生几个重大错误:
这里没有捷径……从长远来看,任何尝试和跳过正确操作的尝试只会浪费很多时间。
希望这有助于您的理解!
想想信息是如何存储在地图中的。有一个数组,其中键存储在由其哈希码索引的位置。即使对于不同的键 K1 和 K2 的哈希码也可能发生冲突,然后,由于冲突解决,布局会根据是 K1 还是 K2 放在首位而有所不同。现在想想如果同时放 K1 和 K2 会是什么结果?这两个过程都认为它们是第一个,所以最好的情况是其中一个键会被删除,最坏的情况是整个表结构会被破坏。
同步的需要不取决于密钥是否唯一。当有多个线程或进程同时进行写操作时,您需要进行同步。
要使地图同步,您可以使用:
Map syncMap = Collections.synchronizedMap(hashMap);