【问题标题】:Maintaining same synchronized array-list between multi-threads in java在java中的多线程之间维护相同的同步数组列表
【发布时间】:2016-01-24 19:35:07
【问题描述】:

我正在使用线程作为一个羽翼未丰的人。所以我需要一些帮助。

对于某些工作,我需要一个数组列表,该值将由所有线程共享。我想要这样的东西,main() 类将在线程创建时向线程提供数组列表。线程将向数组列表添加值,线程所做的更改将反映在该数组列表的每个副本中,重要的是,这必须以同步方式完成。

例如,main() 类给了两个线程数组列表。然后第一个线程在数组的插槽 1 上添加了一个值,第二个线程在添加时会看到更改,当它添加时,它将添加到第二个位置。当 main 将数组列表提供给一个新线程时,之前所做的所有这些更改都将很容易包含在内,并且将从第三个或更晚的位置开始添加。另一件事是,一次只能有一个线程进行更改,或者应该同步。

如何在 Java 中做到这一点?谁能帮帮我?

【问题讨论】:

  • 将同一个 List 传递给所有线程,并确保每次访问都是同步的。或者更好的是,将列表封装在一个委托给列表的类中,并确保同步,并将该类的实例传递给所有线程。开始编码,如果您遇到具体问题,请返回您尝试过的内容。贴出具体问题的描述和代码。
  • 请注意,需要确保在没有其他线程“中断”的情况下,单个线程可以完成以下操作: 1. 找到下一个空闲索引 2. 在该索引处设置一个值。同步是实现这一目标的一种方式。
  • 我将列表封装在一个类中并将其传递给调用线程。有用。对于同步,我使用了对方法进行同步访问的 singelton 类。谢谢@JBNizet
  • 为了正确同步,我使用了具有对方法的同步访问的 singelton 类。谢谢@DavidSoroko

标签: java arrays multithreading


【解决方案1】:

集合框架为同步提供了方便的包装器:

        List<TypeOfItem> list = Collections.synchronizedList( new ArrayList<>() );

您可以传递这样的列表,以便由不同的线程添加、删除、读取等。每次访问都会同步。

【讨论】:

  • 当线程需要找到最小的未分配索引并以原子方式填充它时,这在场景中没有帮助。
  • 你为什么要这样做? ArrayList 为您维护这些东西。只需使用 add() 即可将项目添加到列表中。
  • 因为 thread2 可能已经决定 a[1] 空闲并且即将写入值 2。同时 thread3 也会确定 a[1] 空闲并且即将写入值 3 . 你最终会遇到一个竞争条件,相同的代码有时会产生 a[1]=2 有时会产生 a[1]=3
  • 我将列表封装在一个类中并将其传递给调用线程。有用。对于同步,我使用了对方法进行同步访问的 singelton 类。谢谢@Heri
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2014-07-27
  • 2011-05-05
相关资源
最近更新 更多