当前位置: 首页 > 知识库问答 >
问题:

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

顾梓
2023-03-14

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

在mediator中,可以注册汽车(listadd),并且为了避免碰撞,每次在告诉汽车移动之前都必须迭代汽车列表,以便检查它们当前的位置。当然,我们处于一个多线程的环境中,在一个线程逐车的模型中,这意味着一个线程可以潜在地注册一辆新车,而另一个线程可以同时移动一辆已有的车,如果两辆车的位置(x,y)相同,就会导致碰撞。

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

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

在我看来,我应该将arraylist与锁一起使用。您确认copyonwritearraylist不适用于这种情况吗?你有别的解决办法吗?

提前致谢。

共有1个答案

通啸
2023-03-14

看来你需要一个同步列表。可以使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());
   }
 类似资料:
  • 我的 Web 应用程序中出现随机错误,我迷路了。我创建了一个库来解码代码。我尝试了很多,从未失败过测试。但突然间,它开始随机失败。由于它在单线程测试中运行良好,有时在 servlet 环境中失败时,我能想象的唯一解释是问题与多线程环境中使用的库有关。老实说,我知道多线程是一个非常复杂的问题。我担心我的库可能不是线程安全的。顺便说一下,它非常简单,它是一个具有几种静态方法的正面类。基本上,假设您正在

  • 我想编写一个spring boot批处理应用程序,其中我有一个充满事件的数据库表。我想做的是有一个多线程的spring boot批处理应用程序,它将以这种方式工作: 我想有5个线程运行,每个线程将保留一个偏移量来跟踪它读取的事件,以便没有其他线程再次读取相同的事件。我想怎么做: 所以我希望能够在数据库表中为每个线程保留偏移量。有没有办法让Spring Boot环境以这种方式工作?

  • 问题内容: 我有一个对象,其内部可变状态正在由一个或多个线程不断更新。对象已同步,目标是从另一个线程定期保存其状态(通过序列化): 问题: 在这种情况下,序列化安全吗? 它是如何工作的?也就是说,执行序列化是否会阻塞直到不再有线程运行? 如果同步不使用固有锁,而是使用其他锁怎么办? 问题答案: 在这种情况下,序列化安全吗? 否。正如@Tom Hawtin所说,您将需要执行自己的锁定,以确保在序列化

  • 如果我有多个线程,每个线程使用injector获取EntityManager对象,每个线程使用em对象选择其他类对象的列表。准备好在for循环中使用。 如果一个线程首先完成并调用clear(),这会影响其他线程吗?比如for循环会有异常? 谢谢你。

  • 问题内容: 典型的(对于x86-64平台和Linux OS)是在开始时幼稚地锁定互斥锁并在完成后将其释放,还是以更巧妙的方式将互斥锁锁定在更精细的级别,从而减少了锁争用?如果确实采用第二种方法,那么该如何做? 问题答案: 经营多个分配 场所 。每个竞技场都有自己的锁。当线程需要分配内存时,选择一个竞技场,将其锁定,然后从中分配内存。 选择竞技场的机制有些复杂,旨在减少锁争用: 考虑到这一点,基本上

  • 我正在使用多线程执行插入操作。我使用了带注释的方法,我的方法是注释。但我无法执行插入操作,导致出现以下异常。 异常线程"Thread-21"javax.persistence.Transaction必需异常:在org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)在sun.reflect.Native