多线程java代码的java.util.ConcurrentModificationException

多线程java代码的java.util.ConcurrentModificationException,java,multithreading,Java,Multithreading,在多线程中运行java代码时,我在“String name=(String)keys.next();”行中得到了ConcurrentModificationException。导致错误的函数部分如下所示: if (inputStr == null) return null; String tempStr = new String(inputStr); Properties props = System.getProperties(); Iterato

在多线程中运行java代码时,我在“String name=(String)keys.next();”行中得到了ConcurrentModificationException。导致错误的函数部分如下所示:

 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详细信息如下:

 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位于 java.util.Hashtable$Enumerator.next(未知源代码)位于 com.pb.common.util.ResourceUtil.ReplaceWithSystemPropertyValue(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) 在logSumCalculator.ModeChoiceModel.(ModeChoiceModel.java:41) 运行(ModeChoiceTask.java:59)


键的迭代方式有问题吗?

在对集合进行迭代或枚举时,不能修改键/内容


为要修改的元素创建临时保持架,然后使用它进行更改。

在集合上迭代或枚举时,不能修改键/内容

为要修改的元素创建临时保持架,然后使用它进行更改。

请参阅以下的javadoc:

如果在创建迭代器后的任何时候,以迭代器自己的remove方法以外的任何方式修改哈希表的结构,迭代器将抛出ConcurrentModificationException

似乎您正在另一个线程中调用
System.getProperties()
上的
setProperty

请参阅以下的javadoc:

如果在创建迭代器后的任何时候,以迭代器自己的remove方法以外的任何方式修改哈希表的结构,迭代器将抛出ConcurrentModificationException


似乎您正在另一个线程中调用
System.getProperties()
上的
setProperty

您需要在迭代时同步属性:

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

您需要在迭代时同步属性:

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

因为这里没有修改
属性
对象,所以问题出在其他地方。您是否在应用程序中设置了系统属性?是的,系统属性在应用程序中设置。然后向我们展示该代码,并解释您打算如何将其与此代码同步,因为这是错误的。因为您没有在此处修改
属性
对象,所以问题出在其他地方。您是否在应用程序中设置了系统属性?是的,系统属性在应用程序中设置。然后向我们展示该代码,并解释您打算如何将其与此代码同步,因为这是错误的。