Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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.util.ConcurrentModificationException_Java_Hashset_Synchronized - Fatal编程技术网

同步不工作,仍然是java.util.ConcurrentModificationException

同步不工作,仍然是java.util.ConcurrentModificationException,java,hashset,synchronized,Java,Hashset,Synchronized,我有以下Java代码: 但是同步的效果不好,救命 java.util.ConcurrentModificationException 位于的java.util.ConcurrentModificationException java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)位于 java.util.HashMap$KeyIterator.next(HashMap.java:1466)位于 java.util.AbstractCol

我有以下Java代码:

但是同步的效果不好,救命

java.util.ConcurrentModificationException

位于的java.util.ConcurrentModificationException java.util.HashMap$HashIterator.nextNode(HashMap.java:1442)位于 java.util.HashMap$KeyIterator.next(HashMap.java:1466)位于 java.util.AbstractCollection.toArray(AbstractCollection.java:196)位于 Main.m(Main.java:68)在Main.lambda$Main$0(Main.java:25)在 run(Thread.java:748)

公共类主{
public static Set objectSet=new HashSet();
公共静态void main(字符串[]args)引发异常{
新线程(()->{m();}).start();
新线程(()->{add();}).start();
}   
公共静态void add(){
while(true){
添加(新对象());
}
}
公共静态void m(){
while(true){
试一试{
已同步(对象集){
List a=Arrays.asList(objectSet.toArray(新对象[0]);
System.out.println(a.size());
}
}捕获(例外e){
e、 printStackTrace();
}
试一试{
睡眠(1000);
}捕获(例外e){
}
}
}
}

无法同步(java.util.ConcurrentModificationException)

写入程序还应在同一对象上同步

add
方法更改为

public static void add() {
    while (true) {
        synchronized (objectSet) {
            objectSet.add(new Object());
        }
    }

}

只需使用
publicstaticsetobjectset=Collections.synchronizedSet(newhashset())
synchronized
是协作的。在
m()
中使用它,而不是在
add()
中使用它是没有意义的。(另外,每个JavaSE集合类都有一个复制另一个集合的构造函数,因此您只需编写
lista=newarraylist(objectSet);
public static void add() {
    while (true) {
        synchronized (objectSet) {
            objectSet.add(new Object());
        }
    }

}