【问题标题】:synchronized not work ,still java.util.ConcurrentModificationException同步不起作用,仍然是 java.util.ConcurrentModificationException
【发布时间】: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&lt;Object&gt; objectSet = Collections.synchronizedSet(new HashSet&lt;&gt;())
  • synchronized 是合作的。在m() 中使用它是没有意义的,但在add() 中却没有。 (另外,每个 Java SE 集合类都有一个复制另一个集合的构造函数,所以你可以写List&lt;?&gt; a = new ArrayList&lt;Object&gt;(objectSet);。)

标签: java hashset synchronized


【解决方案1】:

编写者也应该在同一个对象上同步

add方法改成

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

}

【讨论】:

    猜你喜欢
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多