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

时间:2017-06-09 03:28:32

标签: java multithreading guava

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

Set<String> s = new HashSet<>();

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

for (int i = 0; i < 1234; i++) {
    // add, remove from s
}

当线程B从s:

创建ImmutableSets时
for (int i = 0; i < 5678; i++) {
    Set<String> newS =  ImmutableSet.copyOf(s);
}

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

如果它是线程安全的,那么在没有锁定集合的情况下如何实现?

2 个答案:

答案 0 :(得分:6)

相关问题并不是copyOf是否安全 - 它从复制的集合是否安全,特别是它通过iterator()方法创建的迭代器是否是线程安全的。对于HashMap,答案是否定的。

答案 1 :(得分:4)

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