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

时间:2017-09-21 09:40:46

标签: java multithreading list

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

在调解员中,可以注册汽车(List添加),并且为了避免碰撞,每次在汽车被告知移动之前必须重复汽车列表,以便检查他们当前的位置。当然,我们处于多线程环境中,采用逐个线程模型,这意味着一个线程可以注册新车,而另一个线程可以同时移动现有汽车,如果两辆车发生碰撞具有相同的位置(x,y)。

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

如果我理解得很清楚,CopyOnWriteArrayList是线程安全的,但只提供汽车列表的副本,这些副本并不总是底层阵列的最新版本。所以,我可能会使用它进行碰撞。 否则,我可以使用带有ReentrantLock的简单ArrayList来锁定寄存器和handleMove方法,并使用Condition对象使当前线程在检测到潜在冲突时等待。

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

先谢谢。

1 个答案:

答案 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());
   }