- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个单线程应用程序,它遍历一个巨大的树结构,子项存储在一个列表中。迭代器总是在不可修改的列表上运行:
public List<HierarchyNode> getChildren() {
return Collections.unmodifiableList(children);
}
我仍然在某个时候得到一个 ConcurrentModificationException,我认为这在不可修改的列表中是不可能的?迭代是使用访问者完成的...知道这是怎么可能的吗?
编辑:唯一可以修改此列表的是持有列表的类的构造函数:
private final List<HierarchyNode> children;
也许这与树的内存使用量相当大(>4GB)有关?
跟踪:
Testcase: testParserSingleFile(General.NetlistBuilder): Caused an ERROR
null
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1067)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitArchitectureNode(HierarchyNodeVisitorImplementation.java:20)
at com.bevm.semantics.netlist.NetlistBuilder.visitArchitectureNode(NetlistBuilder.java:40)
at com.bevm.hierarchy.ArchitectureNode.accept(ArchitectureNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitEntityNode(HierarchyNodeVisitorImplementation.java:33)
at com.bevm.semantics.netlist.NetlistBuilder.visitEntityNode(NetlistBuilder.java:33)
at com.bevm.hierarchy.EntityNode.accept(EntityNode.java:33)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitComponentNode(HierarchyNodeVisitorImplementation.java:27)
at com.bevm.hierarchy.ComponentNode.accept(ComponentNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitInstanceNode(HierarchyNodeVisitorImplementation.java:45)
at com.bevm.semantics.netlist.NetlistBuilder.visitInstanceNode(NetlistBuilder.java:85)
at com.bevm.hierarchy.InstanceNode.accept(InstanceNode.java:89)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitArchitectureNode(HierarchyNodeVisitorImplementation.java:21)
at com.bevm.semantics.netlist.NetlistBuilder.visitArchitectureNode(NetlistBuilder.java:40)
at com.bevm.hierarchy.ArchitectureNode.accept(ArchitectureNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitEntityNode(HierarchyNodeVisitorImplementation.java:33)
at com.bevm.semantics.netlist.NetlistBuilder.visitEntityNode(NetlistBuilder.java:33)
at com.bevm.hierarchy.EntityNode.accept(EntityNode.java:33)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitComponentNode(HierarchyNodeVisitorImplementation.java:27)
at com.bevm.hierarchy.ComponentNode.accept(ComponentNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitInstanceNode(HierarchyNodeVisitorImplementation.java:45)
at com.bevm.semantics.netlist.NetlistBuilder.visitInstanceNode(NetlistBuilder.java:85)
at com.bevm.hierarchy.InstanceNode.accept(InstanceNode.java:89)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitArchitectureNode(HierarchyNodeVisitorImplementation.java:21)
at com.bevm.semantics.netlist.NetlistBuilder.visitArchitectureNode(NetlistBuilder.java:40)
at com.bevm.hierarchy.ArchitectureNode.accept(ArchitectureNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitEntityNode(HierarchyNodeVisitorImplementation.java:33)
at com.bevm.semantics.netlist.NetlistBuilder.visitEntityNode(NetlistBuilder.java:33)
at com.bevm.hierarchy.EntityNode.accept(EntityNode.java:33)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitComponentNode(HierarchyNodeVisitorImplementation.java:27)
at com.bevm.hierarchy.ComponentNode.accept(ComponentNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitInstanceNode(HierarchyNodeVisitorImplementation.java:45)
at com.bevm.semantics.netlist.NetlistBuilder.visitInstanceNode(NetlistBuilder.java:85)
at com.bevm.hierarchy.InstanceNode.accept(InstanceNode.java:89)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitGenerateNode(HierarchyNodeVisitorImplementation.java:39)
at com.bevm.semantics.netlist.NetlistBuilder.visitGenerateNode(NetlistBuilder.java:79)
at com.bevm.hierarchy.GenerateNode.accept(GenerateNode.java:27)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitArchitectureNode(HierarchyNodeVisitorImplementation.java:21)
at com.bevm.semantics.netlist.NetlistBuilder.visitArchitectureNode(NetlistBuilder.java:40)
at com.bevm.hierarchy.ArchitectureNode.accept(ArchitectureNode.java:25)
at com.bevm.hierarchy.HierarchyNodeVisitorImplementation.visitEntityNode(HierarchyNodeVisitorImplementation.java:33)
at com.bevm.semantics.netlist.NetlistBuilder.visitEntityNode(NetlistBuilder.java:33)
at com.bevm.hierarchy.EntityNode.accept(EntityNode.java:33)
at com.beckhoff.vmagic.hierarchy.HierarchyNodeVisitorImplementation.visit(HierarchyNodeVisitorImplementation.java:15)
at General.NetlistBuilder.testParserSingleFile(NetlistBuilder.java:125)
最佳答案
所以 Collection.unmodifiableList
并不是真正的线程安全的。这是因为它创建了底层 List
的不可修改 View 。但是,如果在迭代 View 时底层 List
被修改,您将获得 CME。请记住,CME 不需要由单独的线程引起。如果我执行以下操作,我将获得 CME:
for (String e : myList){
myList.remove(5); // throws CME
}
更好的选择是Guava的ImmutableList这会创建传递列表的不可变副本。
为了澄清由于评论,将发布的代码替换为:
public List<HierarchyNode> getChildren() {
return ImmutableList.copyOf(children);
}
从此方法返回的 List
保证永远不会抛出 CME。
更新:
如果您仍在尝试找出它在您的代码中出现的原因,请考虑以下几点:
children
列表是否可以修改(我指的是传递给 unmodifiableList
的可修改 List
)?getChildren
的类曾经导致以可能更新列表的方式调用保存可修改列表的类?Iterator
实例?关于java - 单线程 unmodifiableList 中的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13232657/
此代码似乎在启用优化的广泛使用的编译器上中断,尽管它在 Visual Studio 中运行良好。 struct foo { foo(int a) { s[0] = '0'+a%10;s[1]
我想要一个图表,其中有一个单线箭头,如下所示: 1 2 3 4 5 或者像这样(其中/假设是一个箭头:)): \/ -----------------
我正在为 Java 编写自定义规则。有两个 Tree.KIND 实例(STRING_LITERAL 和 ASSIGNMENT)需要捕获。有一个特定的行,字符串文字和赋值的逻辑都会引发问题。但 Sona
Rosettacode.org 在 Ruby 中有这个出色的单行 FizzBuzz 解决方案。 1.upto(100){|n|puts'FizzBuzz '[i=n**4%-15,i+13]||n
很多时候我使用了这个命令,它在当前目录打开了一个临时的 HTTP 服务器: python3 -m http.server 现在我需要接收文件,有没有打开ftp服务器的一行命令? 我只是在寻找一个命令行
相关主题 std::unique_ptr, deleters and the Win32 API 要将 Win32 句柄用作 RAII,我可以使用以下行 std::unique_ptr::type,
我认为必须有一个单行 Guava 解决方案来将一个不可变列表转换为另一个不可变列表,但我找不到它。假设我们有以下对象: ImmutableList input = ImmutableList.of("
我有以下 Highcharts ( http://www.highcharts.com ) 散点图。请注意,轴从 -10 开始,到 10 停止,中间为 0。我希望每条 0 线的宽度或颜色都与其他线不同
我有一个项目需要将一个视频文件与另一个音频文件合并。预期的输出是一个视频文件,其中包含来自实际视频的音频和合并后的音频文件。输出视频文件的长度将与实际视频文件的大小相同。 是否有单行 FFMPEG 命
我在 python3 类中有 2 个列表: self.keys = ["a","b","c","d"] self.values = [1,2,3,4] len(self.keys) == len(se
我有一个不同长度的数组列表,我想将它们组合成一个最大维度的矩阵,并在末尾填充零。例如(伪代码): combine( [1,2,3], [4,5]) [[1,2,3],[4,5,0]] 这是我目前的解决
例如,给定 i=5 和 n=8,我想生成 [0;0;0;0;1;0; 0;0]。具体来说,我想生成向量 v 以便: v = zeros(n,1); v(i) = 1; 有没有一种(合理的)方法可以在一
我是一名优秀的程序员,十分优秀!