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

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

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

这使我相信,如果修改不是结构性的(即没有添加或删除),我应该能够更新(非并发)映射无同步。

我读的是正确的吗?即更新地图中的值是否是原子过程?

最佳答案

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

但是,除非有其他同步正在进行(例如,如果值是AtomicIntegers之类的东西),则在更新键/值对时一个线程进行的更新不一定对其他线程可见。最重要的是,不能保证该线程甚至会看到自己的更新,因为它们可能会被其他线程破坏。

希望这可以帮助!

07-24 15:21