并发修改例外

Jag*_*ran 2 java concurrency multithreading

java.util.ConcurrentModificationException在这个方法上得到以下内容

private AtomicReference<HashMap<String, Logger>> transactionLoggerMap = new AtomicReference<HashMap<String,Logger>>();

public void rolloutFile() {

    // Get all the loggers and fire a temp log line.
    Set<String> transactionLoggerSet = (Set<String>) transactionLoggerMap.get().keySet();
    Iterator<String> transactionLoggerSetIter = transactionLoggerSet.iterator();
    while(transactionLoggerSetIter.hasNext()){
        String key = (String) transactionLoggerSetIter.next();
        Logger txnLogger = transactionLoggerMap.get().get(key);
        localLogger.trace("About to do timer task rollover:");
        txnLogger.info(DataTransformerConstants.IGNORE_MESSAGE);
    }
}
Run Code Online (Sandbox Code Playgroud)

请建议,如果我使用原子参考,我如何获得como?

Gra*_*ray 9

A ConcurrentModificationException表示您已在迭代器之外修改了集合.我没有在你的循环中看到任何修改,所以我假设还有另一个线程也在transactionLoggerMap你迭代它的同时添加或删除.

即使你将它包装在一起AtomicReference,你仍然不能让两个线程同时对同一个非同步集合进行更改. AtomicReference没有同步是包装对象-它只是给你一个方法以原子获取和设置参考.

您需要通过使用ConcurrentHashMap类或HashMap使用Collections.synchronizedMap(map)方法包装来使其成为同步集合.