1

让我们假设“键”永远不会重叠,但对于应用程序来说是唯一的。换句话说,每个 put 都将never被调用相同的键。在这种情况下 :

  1. map.put 是否需要同步?

  2. 如果是,那么如何?

例如,假设<Name, Id>在一个虚构的世界中,每个人的名字都是唯一的。在这样的应用程序中,我需要同步 map put 吗?

4

4 回答 4

3

是的。例如:put()新键上的 a 可能导致resize()地图上的 a - 两个同时resize()调用可能导致数据结构的内部变得不一致。不一致可能意味着诸如(实际见证)导致后续调用put()无限循环,因为它使内部引用不一致并创建了一个循环。

于 2013-10-12T02:13:29.673 回答
1

您绝对需要使用同步,即使使用唯一键,除非您 100% 保证底层 Map 实现是并发的。

例如,如果您尝试和误用具有同步功能的标准 HashMap,则可能会发生几个重大错误:

  1. 不同的密钥仍然可以散列到同一个桶——导致链损坏,通常会导致条目丢失。
  2. 当增量/减量被覆盖时,集合大小可能会变得不正确。
  3. 调整大小会导致损坏。

这里没有捷径……从长远来看,任何尝试和跳过正确操作的尝试只会浪费很多时间。

希望这有助于您的理解!

于 2013-10-12T04:34:22.590 回答
1

想想信息是如何存储在地图中的。有一个数组,其中键存储在由其哈希码索引的位置。即使对于不同的键 K1 和 K2 的哈希码也可能发生冲突,然后,由于冲突解决,布局会根据是 K1 还是 K2 放在首位而有所不同。现在想想如果同时放 K1 和 K2 会是什么结果?这两个过程都认为它们是第一个,所以最好的情况是其中一个键会被删除,最坏的情况是整个表结构会被破坏。

于 2013-10-12T06:44:30.623 回答
0

同步的需要不取决于密钥是否唯一。当有多个线程或进程同时进行写操作时,您需要进行同步。

要使地图同步,您可以使用:

Map syncMap = Collections.synchronizedMap(hashMap);
于 2013-10-12T02:18:33.570 回答