gpt4 book ai didi

java - HashSet 和多线程

转载 作者:搜寻专家 更新时间:2023-11-01 02:37:53 24 4
gpt4 key购买 nike

我在 Java 7 上工作。

我想知道 contains 方法在 HashSet 对象上是否是线程安全的。

HashSet 由一个线程初始化。然后我们用不可修改的集合 (Collections.unmodifiableSet) 包装 HashSet。初始化后,多个线程只调用方法contains

当我阅读 Javadoc 时,我并不清楚。

关于 HashSet Javadoc我们可以阅读

This class implements the Set interface, backed by a hash table (actually a HashMap instance).

...

Note that this implementation is not synchronized.

HashMap Javadoc 上,我们可以读到:

Note that this implementation is not synchronized. 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.)

对我来说,这意味着 contains 方法不是结构修改。

那么多次调用方法contains是线程安全的吗?

如果它是真的:它是否在所有 JVM 实现(如 IBM JVM)上得到保证?

最佳答案

一般来说,不可能只在读取操作之间存在并发竞争(因此也不会发生冲突)。读写操作之间会出现并发问题。因此,交错的多个读取操作始终是线程安全的(如果我们假设这种线程安全的概念定义明确的话)。

现在,还有一种情况可能存在并发问题,这是在数据结构初始化期间,因为在您的情况下,这可以被认为是唯一的修改(写操作)。为了确保所有后续的 contains() 调用都将看到完全初始化的 Set,您必须确保它已正确初始化。此概念在 Java 中被定义为“安全发布”,您可以阅读更多相关信息 here或在书中"Java Concurrency in Practice"书。

总而言之,Collections.unmodifiableSet() 通过 final 字段以安全的方式发布结果。 所以,是的,您可以确定所有 contains() 都将看到完全初始化的 Set

关于java - HashSet 和多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42313646/

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