同步不工作,仍然是java.util.ConcurrentModificationException
我有以下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)同步不工作,仍然是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
公共类主{
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());
}
}
}