ConcurrentHashmap 同时进行写入和获取操作

ConcurrentHashmap simultaneous write and get operations

我对 ConcurrentHashMaps 有疑问。假设我有 2 个线程。 线程 A 尝试从共享的 ConcurrentHashMap 中获取对象。 线程 B 清除共享映射。 如果线程 A 和线程 B 同时访问共享资源会发生什么情况。我搜索了文档和网络,找不到明确的答案,也尝试自己做但无济于事。

不能有两个线程同时更改 事物。使用这种数据结构的全部意义在于它们 防止 多个线程 更新 同时 "core internal data"。

让两个线程同时更改地图是不可能的。因为 ConcurrentHashMap 中的代码不会允许两个线程并行!

但是:当一个线程是读,另一个是更新 该数据;事情不一样了!由于 reading 部分可以 "enter" 临界区,即使它当前由另一个线程拥有。

ConcurrentHashMap根据并发级别分为不同的。所以不同的线程可以在java.

中并发访问不同的段

Can threads read the segment of ConcurrentHashMap locked by some other thread in java?

是的。当线程锁定一个段进行更新时,它不会阻止它进行检索(通过 get 方法完成),因此其他线程可以读取该段(通过 get 方法),但它能够在锁定之前读取数据。

对于 putAll 等操作,并发检索可能反映仅删除了一些条目。 对于 clear 等操作,并发检索可能反映仅删除了一些条目。

文档对这种情况很清楚:

Retrieval operations (including get) generally do not block, so may overlap with update operations (including put and remove).

因此,如果两个线程同时使用该资源,但一个正在读取而另一个正在更新,您可能会读取不可用的资源。
有关详细信息,请查看 documentation paragraph 2