【问题标题】:Getting a "rare" ConcurrentModificationException during program execution在程序执行期间获得“罕见”的 ConcurrentModificationException
【发布时间】:2018-01-08 14:28:12
【问题描述】:

我正在使用 Optaplanner 创建一个程序,并且我不断收到此异常,但仅在极少数情况下,大多数时候我可以毫无问题地执行我的程序,并且很难重现该问题,因为它只是有时会发生.. .

Exception in thread "main" java.util.ConcurrentModificationException: java.util.ConcurrentModificationException
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	...
 	at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:503)
	at org.optaplanner.core.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:331)
	at org.optaplanner.core.config.solver.SolverConfig.buildSolver(SolverConfig.java:220)
	at org.optaplanner.core.impl.solver.AbstractSolverFactory.buildSolver(AbstractSolverFactory.java:61)
	at org.avalin.optaplanner.main.EmployeeRoster.buildEvaluationSolver(EmployeeRoster.java:247)
	at org.avalin.optaplanner.main.EmployeeRoster.main(EmployeeRoster.java:82)
Caused by: java.util.ConcurrentModificationException
	at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1138)
  ...
  	at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291)
	at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:747)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:283)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1603)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:175)

这是它似乎发生在的 buildEvaluationSolver 方法:

private static Solver buildEvaluationSolver()
{
    SolverFactory solverFactory = SolverFactory.createFromXmlResource(EVALUATION_CONFIG_XML);
    return solverFactory.buildSolver();
}

我假设某些东西在同时发生变化的同时被迭代,但对我来说最难的部分是弄清楚如何/在哪里,如果它是我的代码,在 createfromxmlresource 时使用 xstream 的东西或第三个东西。

希望这对某些人有意义


编辑:我了解到我可能应该包含警告

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/Users/path/my.jar) to field java.util.TreeMap.comparator
WARNING: Please consider reporting this to the maintainers of com.thoughtworks.xstream.core.util.Fields
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

问题似乎源于出现此错误的计算机使用的是 JDK9,它通常与 JDK8 一起工作正常。我们在给定的计算机上降级到 JDK8,之后就没有看到错误了。

【问题讨论】:

  • 听起来像是线程之间缺少同步。

标签: java xstream optaplanner concurrentmodification


【解决方案1】:

您可能通过调用 solverFactory.getSolverConfig()(例如动态配置终止时间限制)从不同线程修改相同的 solverFactory 实例

解决方案:在文档中查找SolverFactory.cloneSolverFactory()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多