我有一个汽车网格,每辆车在网格上都有一个独特的位置(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());
}