我有一个EnumSet
,它是final和immutable,即在构造函数中初始化一次。
此contains()
线程上的EnumSet
方法是否安全?它在内部使用迭代器来进行包含检查。因此,如果两个线程同时调用contains()
,一个调用中的迭代器位置会影响另一个吗?或者这两个线程调用中的迭代器是否有不同的实例?
答案 0 :(得分:1)
EnumSet
的内容可以更改,尽管引用是最终的。否EnumSet
是不可变的。但是,您可以通过EnumSet
打包Collections.unmodifiableSet()
。如果您还避免保留对原始EnumSet
的任何引用,则不可修改的包装器对象在功能上是不可变的。
可变性,但只要Set
未被修改,两个迭代器同时在同一Set
上运行就没有问题。这与仅仅一个迭代器的情况完全不同。
在任何情况下,contains()
的{{1}}方法都可能无法创建或使用迭代器。该类通过位向量实现成员资格,因此它使用位操作来执行EnumSet
测试。
答案 1 :(得分:0)
不,如果两个线程同时调用contains()
,则会调用iterator()
两次,这将创建两个独立的迭代器。
如果你试图在两个线程之间共享一个迭代器,那么<em> 就不是一个好主意。
请注意,如果您在一个线程中修改集合,同时在另一个线程中对其进行迭代(例如,通过contains
),那么这些文档就会发挥作用:
返回的迭代器是非常一致的:它永远不会抛出ConcurrentModificationException,它可能会也可能不会显示迭代进行过程中对集合所做的任何修改的影响。