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