如何在多线程环境中访问的Java列表中检测和处理碰撞



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

在调解器中,可以注册汽车(List添加),为了避免碰撞,必须每次告诉汽车移动之前迭代汽车清单,以检查其当前位置。当然,我们处于多线程环境中,在逐卡模型中,这意味着一个线程可以潜在地注册新车,而另一个线程可以同时移动现有汽车,如果两辆汽车,则会碰撞具有相同的位置(x,y)。

要处理汽车列表,我看到了2个解决方案:CopyOnWriteArrayList和一个带有重新进入/条件对象的简单ArrayList

如果我很好地理解,CopyOnWriteArrayList是线程安全的,但仅提供汽车列表的副本,这并不总是基础数组的最新版本。因此,我可能会使用它发生碰撞。否则,我可以使用带有重新输入锁的简单ArrayList锁定寄存器和处理方法,以及如果检测到潜在的碰撞,请等待当前线程。

我认为,我应该将ArrayList与锁一起使用。在这种情况下,您确认CopyOnWriteArrayList不合适吗?您还有另一个解决方案吗?

谢谢。

似乎您需要同步列表。您可以使arraylist与collections.synchronizedlist(arrayList)同步。并确保在迭代时不要更改列表

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

最新更新