Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java guava ImmutableSet.copyOf()线程安全吗?_Java_Multithreading_Guava - Fatal编程技术网

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

Java guava ImmutableSet.copyOf()线程安全吗?,java,multithreading,guava,Java,Multithreading,Guava,我想知道这个调用是否线程安全。例如,如果我有一个集合s: Set<String> s = new HashSet<>(); Set s=newhashset(); 和两个线程A和B,线程A修改集合: for (int i = 0; i < 1234; i++) { // add, remove from s } for(int i=0;i

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

Set<String> s = new HashSet<>();
Set s=newhashset();
和两个线程A和B,线程A修改集合:

for (int i = 0; i < 1234; i++) {
    // add, remove from s
}
for(int i=0;i<1234;i++){
//从中添加、删除
}
线程B从s创建ImmutableSet时:

for (int i = 0; i < 5678; i++) {
    Set<String> newS =  ImmutableSet.copyOf(s);
}
for(int i=0;i<5678;i++){
设置新闻=ImmutableSet.copyOf;
}
假设每次调用
ImmutableSet.copyOf()
时,我都会及时得到一个有效状态为s的不可变集,这样安全吗?是否会出现任何类型的异常(如
ConcurrentModificationException


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

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

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

我有一个问题,我正在使用guava,我不确定这些操作是否正常工作,所以我想看看您是否可以帮我解决。HashSet不是线程安全的,即使没有人同时修改它。哈希集访问始终需要同步。