java:为多个操作同步ArrayList



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

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

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

那么,简单地使用同步块来控制访问是否可以接受?还是这仍然是一个"不"?

我不认为我可以使用同步列表。原因是使用者线程大量消耗:它首先使用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()和get())提供同步。

java.util.concurrent包提供了避免编写自己的代码和重新发明轮子所需的一切。

使用CopyOnWriteArrayList实现您的列表,它的工作就完成了。

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

编辑:

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

最新更新