guava ImmutableSet.copyOf() 线程安全吗?
Is guava ImmutableSet.copyOf() thread safe?
我想知道这个调用是否线程安全。例如,如果我有一组 s:
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()
时我都会及时获得 s 的有效状态的不可变集?是否会发生任何类型的异常(如 ConcurrentModificationException
)?
如果它是线程安全的,它是如何在不锁定集合的情况下实现的?
相关的问题不是 copyOf
是否安全——而是它从 从 复制的集合是否安全,特别是它所复制的迭代器是否安全通过其 iterator()
方法创建的是线程安全的。对于 HashMap,答案是否定的。
HashSet
不是线程安全的。 ImmutableSet.copyOf
需要遍历您的 HashSet
,如果另一个线程正在同时修改它,这是不安全的。更重要的是,你有两个线程修改 HashSet
已经不安全了。
我想知道这个调用是否线程安全。例如,如果我有一组 s:
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()
时我都会及时获得 s 的有效状态的不可变集?是否会发生任何类型的异常(如 ConcurrentModificationException
)?
如果它是线程安全的,它是如何在不锁定集合的情况下实现的?
相关的问题不是 copyOf
是否安全——而是它从 从 复制的集合是否安全,特别是它所复制的迭代器是否安全通过其 iterator()
方法创建的是线程安全的。对于 HashMap,答案是否定的。
HashSet
不是线程安全的。 ImmutableSet.copyOf
需要遍历您的 HashSet
,如果另一个线程正在同时修改它,这是不安全的。更重要的是,你有两个线程修改 HashSet
已经不安全了。