【发布时间】:2018-07-16 13:53:45
【问题描述】:
我有以下 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) 在 java.lang.Thread.run(Thread.java:748)
public class Main {
public static Set<Object> objectSet = new HashSet<>();
public static void main(String[] args) throws Exception {
new Thread(()->{m();}).start();
new Thread(()->{add();}).start();
}
public static void add() {
while (true){
objectSet.add(new Object());
}
}
public static void m(){
while(true){
try {
synchronized (objectSet) {
List a = Arrays.asList(objectSet.toArray(new Object[0]));
System.out.println(a.size());
}
}catch (Exception e){
e.printStackTrace();
}
try {
Thread.sleep(1000);
}catch (Exception e){
}
}
}
}
无法同步 (java.util.ConcurrentModificationException)
【问题讨论】:
-
只要使用
public static Set<Object> objectSet = Collections.synchronizedSet(new HashSet<>()) -
synchronized是合作的。在m()中使用它是没有意义的,但在add()中却没有。 (另外,每个 Java SE 集合类都有一个复制另一个集合的构造函数,所以你可以写List<?> a = new ArrayList<Object>(objectSet);。)
标签: java hashset synchronized