java:为多个操作同步ArrayList

时间:2013-02-13 02:19:19

标签: java arraylist synchronization

我已经读过,不应该在类中同步对Collection实例的访问。原因似乎是另一个对象可能操纵列表,而不同步到第一个对象。但是,我想要同步的List是一个私有字段,由所有者对象创建,并且没有访问器方法。

我正在使用两个内部类,一个生产者和一个使用者,它们各自实现类Runnable并在一个单独的线程中运行。每当他们访问属于父类的列表时,他们就会在父类上进行同步。

此外,我的实现只使用父类的单个实例,以及每个内部的classeses。

那么,仅仅使用同步块来控制访问是否可以接受?或者这仍然是禁忌?

我认为我不能使用synchronisedList。消费者线程大量消耗:首先使用Collections.Sort和比较器进行排序,然后使用subList方法获取列表中前20个(默认情况下)对象的列表(它实际上创建了一个新列表) ,通过将subList调用传递给ArrayList构造函数),然后将subList返回的列表传递给removeAll的原始列表:

Collections.sort(pool, examComparator);

List<Candidate> squad = new ArrayList<Candidate>(pool.subList(0, squadSize));
pool.removeAll(squad);

return squad;

由于这是一个多步操作,并且需要是原子的,我无法看到synchronizedList如何促进它(我理解它)只是为各个方法调用提供同步,例如add()并得到()。

1 个答案:

答案 0 :(得分:1)

java.util.concurrent package拥有您需要的一切,以避免编写自己的代码并重新发明轮子。

使用CopyOnWriteArrayList进行列表实施并完成工作。

编写线程安全实现绝对不是一件容易的事,并且这些类的编写是为了安全且尽可能高效。

编辑:

如果您有生产者消费者模型,请使用BlockingQueue。