java - 为什么这段代码没有触发ConcurrentModificationException?

标签 java java.util.concurrent threadpoolexecutor

我正在从多个线程修改相同的列表,它不应该触发吗 迭代列表时出现 ConcurrentModificationException?

如何触发此异常?

public class ConcurrentTest {

    static List<String> list = setupList();

    public static List<String> setupList() {
        System.out.println("setup predefined list");

        List<String> l = new ArrayList();
        for(int i = 0; i < 50;i++) {
            l.add("test" + i);
        }

        return l;
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(50);

        for(int i = 0; i < 50; i++) {
            executorService.submit( () -> {     
                list.add("key1");       

                Thread currentThread = Thread.currentThread();
                System.out.println( Thread.currentThread().getName() + ", " + list.size() );

                for(String val: list) {
                    try {
                        Thread.sleep(25);
                    }
                    catch(Exception e) {

                    }
                }

            });
        }

        executorService.shutdown();
    }
}

最佳答案

当您在迭代列表时修改列表时,会触发 ConcurrentModificationException。在您的代码中,当您迭代列表时,您只 hibernate 线程并且不修改它。这将触发异常:

for(String s: list) {
    list.add("something");
}

关于java - 为什么这段代码没有触发ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58929952/

相关文章:

java - 解码长 XML 文件的单个非根节点

java - 日期/时间的模式匹配?

java - 并发 hashmap size() 方法复杂度

Python ThreadPoolExecutor 终止所有线程

java - 解决maven "Failed to resolve artifact"的非平凡依赖问题的解决方法

运行ant时出现java.lang.NoClassDefFoundError

multithreading - cpu松弛是什么意思?

java - 执行器是否意味着被重用?

java - LinkedBlockingQueue unbounded 和 LinkedBlockingQueue with capacity 哪个更好

java - 如果单例 block 中的内部静态可运行对象用作可调用对象的包装器,如果它修改单例的静态参数,它会吗?