是否将Map的值更改为原子操作?

Oli*_*ist 8 java collections concurrency atomic map

我想知道是否需要同步或使用并发类,或者相反,在多线程环境中使用非并发类并且在地图上不进行同步是不是线程安全的,如果对地图的唯一修改正在改变地图.

我问这个的原因是HashMap(和其他非并发地图文档)有这样的评论:

请注意,此实现不同步.如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步.(结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改.)这通常通过同步自然封装映射的某个对象来完成. .

这让我相信如果修改不是结构性的(即没有添加或删除)我应该能够更新(非并发)地图sans同步.

我读这个是对的吗?即将地图中的值更新为原子过程吗?

tem*_*def 5

更新映射值不是原子过程.但是,每个尝试同时修改映射值的多个不同线程不会因并发错误而导致非常奇怪的异常或错误.例如,您不会导致其中一个键/值对消失,或者从地图中删除随机元素.

然而,这些更新由一个线程更新键/值对时不一定会向其他线程可见,除非有一些其他的同步正在进行(例如,如果这些值类的东西制成AtomicIntegers).除此之外,不能保证线程甚至会看到自己的更新,因为它们可能会受到其他线程的破坏.

希望这可以帮助!

  • 我见过一个例子,其中对 HashMap 的并发插入实际上破坏了事情。是的,它“确实”破坏了集合,以至于由于存储桶丢失而抛出 NullPointerExceptions。我正在尝试重新找到它......但与此同时,要知道如果没有同步,对于像 HashMap 这样复杂的数据结构,您就不能依赖任何东西来工作。 (2认同)
  • @cHao - 文档中的关键短语是"修改地图*结构*".更新价值不是结构性变化; 插入和删除键是.问题和答案都解决了这个问题. (2认同)