如果所有键都是唯一的,那么地图的放置是否需要同步?

时间:2013-10-12 02:09:47

标签: java map synchronization

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

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

  2. 如果是,那怎么做?

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

例如,有几个主要错误可以&amp;可能会发生,如果你尝试&amp;滥用标准的HashMap同步:

  1. 不同的密钥仍然可以散列到同一个存储桶 - 导致链损坏,通常会导致条目丢失。
  2. 当覆盖增量/减量时,集合大小可能会变得不正确。
  3. 调整大小会导致损坏。
  4. 这里没有捷径。任何尝试尝试&amp;从长远来看,跳过这样做只会浪费很多时间。

    希望这有助于您的理解!

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

Map syncMap = Collections.synchronizedMap(hashMap);