2016-01-28 4 views
0

Я получил ConcurrentModificationException в «String name = (String) keys.next();» когда я запускал Java-код в многопоточном режиме. Часть функции, что вызвало ошибку следующим образом:java.util.ConcurrentModificationException для многопоточного кода Java

if (inputStr == null) 
     return null; 

    String tempStr = new String(inputStr); 

    Properties props = System.getProperties(); 
    Iterator keys = props.keySet().iterator(); 

    while (keys.hasNext()) { 
     String name = (String) keys.next(); 
     String value = props.getProperty(name); 

     //Build a pattern and compile it 
     String patternStr = "%" + name + "%"; 
     Pattern pattern = Pattern.compile(patternStr); 

     // Replace all occurrences of pattern in input string 
     Matcher matcher = pattern.matcher(tempStr); 
     tempStr = matcher.replaceAll(value); 
    } 

деталь StackTrace выглядит следующим образом:

Вызванный: java.util.ConcurrentModificationException на java.util.Hashtable $ Enumerator. следующий (Unknown Source) на com.pb.common.util.ResourceUtil.replaceWithSystemPropertyValues ​​(ResourceUtil.java:350) на com.pb.common.calculator.ControlFileReader.searchAndReplaceWithEnv (ControlFileReader.java:610) в ком .pb.common.c alculator.ControlFileReader.readMatrixDataEntries (ControlFileReader.java:493) на com.pb.common.calculator.ControlFileReader. (ControlFileReader.java:109) на misc.UtilityExpressionCalculator. (UtilityExpressionCalculator.java:191) в разное .AbstractChoiceHandler.createUtilityExpressionCalculator (AbstractChoiceHandler.java:84) на logSumCalculator.ModeChoiceModel. (ModeChoiceModel.java:41) в logSumCalculator.ModeChoiceTask.run (ModeChoiceTask.java:59)

есть проблема с тем, как ключи повторяются?

+3

Потому что вы не изменяя 'Properties' объект здесь, проблема лежит где-то в другом месте. Вы устанавливаете свойства системы в своем приложении? – erickson

+0

Да, системные свойства заданы в приложении. – Gaurav

+0

Затем покажите нам этот код и объясните, как вы намеревались его синхронизировать с этим кодом, потому что это то, что сломано. – erickson

ответ

2

Вам необходимо синхронизировать на свойства в то время как итерация:

Properties props = System.getProperties(); 
synchronized(props) { 
    // do work here ... 
} 
+0

Спасибо! что решило проблему. – Gaurav

0

Вы не можете изменять ключи/содержимое во время итерации или перечисления по коллекции.

Создайте держатель temp для элементов, которые необходимо изменить, а затем используйте для внесения изменений.

2

Смотрите Javadoc из HashTable:

если Hashtable конструктивно изменен в любое время после того, как итератор создается, каким-либо образом, кроме как через собственный метод удалить итератора, итератор будет бросать ConcurrentModificationException.

Похоже, что вы вызываете setProperty на System.getProperties() в другой поток.

Смежные вопросы