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?
A ConcurrentModificationException
表示您已在迭代器之外修改了集合.我没有在你的循环中看到任何修改,所以我假设还有另一个线程也在transactionLoggerMap
你迭代它的同时添加或删除.
即使你将它包装在一起AtomicReference
,你仍然不能让两个线程同时对同一个非同步集合进行更改. AtomicReference
没有不同步是包装对象-它只是给你一个方法以原子获取和设置参考.
您需要通过使用ConcurrentHashMap
类或HashMap
使用Collections.synchronizedMap(map)
方法包装来使其成为同步集合.
归档时间: |
|
查看次数: |
453 次 |
最近记录: |