2014-10-16 51 views
2

我有一个EnumSet这是最终的和不可变的,即在构造函数中初始化一次。是只读的EnumSet迭代器线程安全吗?

请问EnumSet线程安全的方法是否安全?它在内部使用迭代器来进行包含检查。因此,如果两个线程同时调用,则一个调用中的迭代器位置是否会影响另一个调用?或者这两个线程调用中的迭代器是否有不同的实例?

回答

0

不,如果两个线程同时调用,那将会调用iterator()两次,这将创建两个单独的迭代器。

如果您试图在两个线程之间共享一个迭代器,那么不是一个好主意。

请注意,如果你修改的设置在一个线程中,而在另一个(例如,通过contains)遍历它,然后将文档的此位进场:

返回的迭代器是弱一致的:它将永远不会抛出ConcurrentModificationException,它可能会或可能不会显示迭代过程中发生的对集合所做的任何修改的影响。

1

内容的EnumSet可以尽管参考它是最终被改变。没有EnumSet是不可变的。但是,您可以通过Collections.unmodifiableSet()包装您的EnumSet。如果您还避免保留对原始EnumSet的任何引用,那么不可修改的包装器对象在功能上是不可变的。

尽管有可变性,但只要Set未被修改,两个迭代器在同一时间在同一个Set上操作就没有问题。这与仅有一个迭代器的情况没有任何区别。

在任何情况下,EnumSet的方法可能不会创建或使用迭代器。该类通过位矢量实现成员资格,所以它使用位操作来执行测试。