gpt4 book ai didi

java - 在并发 java 应用程序中使用 for 循环迭代器

转载 作者:行者123 更新时间:2023-12-02 07:30:21 25 4
gpt4 key购买 nike

class NodesgetNodes()方法,即not synchronized 。但是List<Node> nodes -is synchronized 。许多线程可以连接到它,改变 nodes就在其中。

像这样:

class Nodes {
List<Node> nodes = Collections.synchronizedList(new ArrayList<Node>() );

public List<Nodes> getNodes() { return nodes; }
...
}

客户端代码:

Nodes nodes;

synchronized(nodes) {

for(Node node: nodes.getNodes()) {
...
}

}

我没有对此进行讯问测试,但是:

我应该使用 while(iterator.hasNext()) { var = iterator.next() }而不是 for 循环?

因为我知道当我尝试删除nodes.remove(node)时在 for 循环内它失败并显示 ConcurentModificationException .

<小时/>

编辑:(相关问题)

如果迭代器是个好东西,那么使用以下代码(客户端代码):

Iterator<Node> iter = nodes.getNodes().iterator();
while (iter.hasNext()) { // line 1
Node node = iter.next(); // line 2
}

无论如何都不安全:

 1. thread1 goes to line 1, hoping that now iter would return him next() value. 
2. but at that moment thread2 delete that value.
3. thread1 has Exception and fails.

这是否意味着我应该在客户端进行锁定。这是我不想做的。

我拥有的解决方案之一:

while (iter.hasNext()) {

try {
Node node = iter.next();
...

} catch (NoSuchElementException ex) {continue;} // handle exception - do more try
}
<小时/>

编辑:

我的案例的答案是:使用CopyOnWriteArrayList。我什至可以和for-loop呆在一起有了它。

但还有另一种选择:只需向客户返回一份列表副本,让他们知道他们想要什么。因为同时在列表中提供“快照迭代器”和真实数据有点奇怪(不一致)。

最佳答案

Iterator.remove is the only safe way to modify a collection during iteration

来源:The Collection Interface tutorial

关于java - 在并发 java 应用程序中使用 for 循环迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16742763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com