我有一个汽车网格,每个汽车在网格上有一个独特的位置(x,y),谁可以移动。我有一个调解员,它参考了这些汽车的列表,并且应该控制汽车在电网上的移动,特别是控制一次只有一辆汽车可以有相同的位置(x,y)(避免碰撞) )。
在调解员中,可以注册汽车(List
添加),并且为了避免碰撞,每次在汽车被告知移动之前必须重复汽车列表,以便检查他们当前的位置。当然,我们处于多线程环境中,采用逐个线程模型,这意味着一个线程可以注册新车,而另一个线程可以同时移动现有汽车,如果两辆车发生碰撞具有相同的位置(x,y)。
为了处理汽车列表,我看到了两个解决方案:CopyOnWriteArrayList
和一个带有ReentrantLock / Condition对象的简单ArrayList
。
如果我理解得很清楚,CopyOnWriteArrayList
是线程安全的,但只提供汽车列表的副本,这些副本并不总是底层阵列的最新版本。所以,我可能会使用它进行碰撞。
否则,我可以使用带有ReentrantLock的简单ArrayList
来锁定寄存器和handleMove方法,并使用Condition对象使当前线程在检测到潜在冲突时等待。
在我看来,我应该使用带锁的ArrayList
。
在这种情况下,您确认CopyOnWriteArrayList
不合适吗?你有其他解决方案吗?
先谢谢。
答案 0 :(得分:0)
似乎你需要一个同步列表。您可以使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());
}