我已经读过对 Collection 实例的访问不应该在一个类中同步。原因似乎是另一个对象可能会操纵列表,而不与第一个对象同步。但是,我要同步的 List 是一个私有字段,由所有者对象创建,并且没有访问器方法。
我正在使用两个内部类,一个生产者和一个消费者,每个都实现类 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;
由于这是一个多步骤操作,并且需要是原子的,我看不出 synchronisedList 将如何促进它,它(据我了解)只是为单个方法调用提供同步,例如 add() 和 get( )。