gpt4 book ai didi

java - 理解 HashMap 中的 `structural modification`

转载 作者:行者123 更新时间:2023-11-30 07:40:22 24 4
gpt4 key购买 nike

doc , 它说

If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally. (A structural modification is any operation that adds or deletes one or more mappings; merely changing the value associated with a key that an instance already contains is not a structural modification.)

这似乎表明更改与实例已包含的键关联的值不需要外部同步。但我认为这不是线程安全的。对吧?

最佳答案

是的,出于线程可见性的目的,如果您有两个使用 map 进行通信的线程,则需要外部同步。但是不同步的结构更改有可能完全破坏映射(想象一下,当 2 个线程放置一个新映射并且都开始重新散列映射时),而更改映射值不会产生那么显着的影响。

即使只有一个线程进行结构修改,如果后备数组增长/重新散列也会出现问题。使用相同数组(或旧数组,如果数组增长)的其他线程可能会遇到丢失更新(线程将值放入旧数组而不是新数组)、消失的映射(线程将值放入数组,而另一个线程是重新散列相同的数组,值被放入错误的桶中)等等。

那么什么时候同步是安全的?几乎从不。一个安全的情况是一个预构建的映射,线程只访问“他们的”条目,比如

thread1: map.get("A");
thread2: map.put("B", "1"); // Assume "B" was in the map already
thread3: map.get("C");

没有问题,因为没有结构变化并且线程不共享 key 。一旦开始在线程之间共享 key ,就会出现竞争条件和可见性问题。如果您引入结构更改,这些可见性问题可能会导致 map 中的数据丢失。

关于java - 理解 HashMap 中的 `structural modification`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com