guava ImmutableSet.copyOf()线程安全吗?

Chi*_*hin 2 java multithreading guava

我想知道这个调用是否是线程安全的.例如,如果我有一个集合s:

Set<String> s = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

和两个线程A和B,线程A修改集合:

for (int i = 0; i < 1234; i++) {
    // add, remove from s
}
Run Code Online (Sandbox Code Playgroud)

而线程B从s创建ImmutableSets:

for (int i = 0; i < 5678; i++) {
    Set<String> newS =  ImmutableSet.copyOf(s);
}
Run Code Online (Sandbox Code Playgroud)

是否可以安全地假设每次ImmutableSet.copyOf()调用时我得到一个有效状态的不可变集合及时?是否会出现任何类型的异常(例如ConcurrentModificationException)?

如果它是线程安全的,如何在不锁定设备的情况下实现?

ysh*_*vit 7

相关的问题不在于是否copyOf是安全的-这就是它的复制集合是否安全,特别是,无论它通过其创建的迭代iterator()方法是线程安全的.对于HashMap,答案是否定的.


Col*_*inD 5

HashSet不是线程安全的。ImmutableSet.copyOf需要迭代您的HashSet,如果另一个线程同时修改它,这是不安全的。更重要的是,您有两个线程修改HashSet已经是不安全的。