lec*_*eur 6 java collections concurrency multithreading java-7
我在 Java 7 上工作。
我想知道该方法contains在 HashSet 对象上是否是线程安全的。
HashSet 由一个线程初始化。然后我们用不可修改的集合 ( Collections.unmodifiableSet)包装 HashSet 。初始化后,多个线程只调用方法contains。
当我阅读 Javadoc 时,我不清楚。
在HashSet Javadoc 上,我们可以阅读
这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。
...
请注意,此实现不是同步的。
在HashMap Javadoc 上,我们可以阅读:
请注意,此实现不是同步的。如果多个线程并发访问一个散列映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。(结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)
对我来说,这意味着该方法contains不是结构修改。
那么多次调用该方法contains是线程安全的吗?
如果是真的:它是否在所有 JVM 实现(如 IBM JVM)上都有保证?
一般而言,仅在读取操作之间不能存在并发竞争(因此也不会发生冲突)。读写操作之间会出现并发问题。因此,交错的多个读取操作始终是线程安全的(如果我们假设这样的线程安全概念是明确定义的)。
现在,还有一种可能存在并发问题的情况,这是在数据结构的初始化期间,因为在您的情况下,这可以被视为唯一的修改(写操作)。为了确保所有后续contains()调用都会看到完全初始化的 Set,您必须确保它正确初始化。这个概念在 Java 中被定义为“安全发布”,您可以在此处或在“Java 并发实践”一书中阅读更多关于它的信息。
总而言之,Collections.unmodifiableSet()通过final字段以安全的方式发布结果。所以,是的,您可以确定所有人contains()都会看到完全初始化的Set
| 归档时间: |
|
| 查看次数: |
3270 次 |
| 最近记录: |