java.util.ConcurrentModificationException用于多线程Java代码

时间:2016-01-28 16:38:30

标签: java multithreading

我在" String name =(String)keys.next();"得到了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);
    }

堆栈跟踪详细信息如下:

  

引起:java.util.ConcurrentModificationException at   java.util.Hashtable $ Enumerator.next(未知来源)at   com.pb.common.util.ResourceUtil.replaceWithSystemPropertyValues(ResourceUtil.java:350)     在   com.pb.common.calculator.ControlFileReader.searchAndReplaceWithEnv(ControlFileReader.java:610)     在   com.pb.common.calculator.ControlFileReader.readMatrixDataEntries(ControlFileReader.java:493)     在   com.pb.common.calculator.ControlFileReader。(ControlFileReader.java:109)     在   misc.UtilityExpressionCalculator。(UtilityExpressionCalculator.java:191)     在   misc.AbstractChoiceHandler.createUtilityExpressionCalculator(AbstractChoiceHandler.java:84)     at logSumCalculator.ModeChoiceModel。(ModeChoiceModel.java:41)     at logSumCalculator.ModeChoiceTask.run(ModeChoiceTask.java:59)

是否有关于迭代键的问题?

3 个答案:

答案 0 :(得分:2)

请参阅HashTable的javadoc:

  

如果在创建迭代器之后的任何时候对Hashtable进行结构修改,除非通过迭代器自己的remove方法,迭代器将抛出ConcurrentModificationException。

您可能正在另一个帖子中setProperty上调用System.getProperties()

答案 1 :(得分:2)

迭代时需要同步属性:

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

答案 2 :(得分:0)

在对集合进行迭代或枚举时,无法修改键/内容。

为要修改的元素创建临时拥有者,然后使用它来进行更改。