gpt4 book ai didi

java - 如何检测和处理多线程环境中访问的java列表中的冲突?

转载 作者:太空宇宙 更新时间:2023-11-04 11:07:36 25 4
gpt4 key购买 nike

我有一个汽车网格,每辆车在网格上都有唯一的位置(x,y),以及谁可以移动。我有一个调解器,它引用了这些汽车的列表,并且应该控制汽车在网格上的移动,特别是控制一次只有一辆汽车可以具有相同的位置(x,y)(避免碰撞)。

在中介器中,可以注册汽车(List add),为了避免碰撞,每次在汽车被告知移动之前都必须迭代汽车列表,以便检查它们当前的位置。当然,我们处于多线程环境中,采用逐车模型,这意味着一个线程可能会注册一辆新车,而另一个线程可以同时移动现有的汽车,如果两辆车具有相同的位置(x,y),则会导致碰撞。

为了处理汽车列表,我看到了 2 个解决方案:CopyOnWriteArrayList 和一个带有 ReentrantLock/Condition 对象的简单 ArrayList

如果我理解得很好,CopyOnWriteArrayList 是线程安全的,但仅提供汽车列表的副本,而该副本并不总是底层数组的最新版本。所以,我使用它可能会发生碰撞。否则,我可以使用一个带有 ReentrantLock 的简单 ArrayList 来锁定 register 和 handleMove 方法,并使用 Condition 对象在检测到潜在冲突时使当前线程等待。

在我看来,我应该使用带有锁的ArrayList。您确认 CopyOnWriteArrayList 不适合这种情况吗?您还有其他解决方案吗?

提前致谢。

最佳答案

看来您需要一个同步列表。您可以使用 Collections.synchronizedList(arrayList) 使 ArrayList 同步。并确保在迭代列表时没有线程更改列表

   List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}

关于java - 如何检测和处理多线程环境中访问的java列表中的冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46340547/

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