gpt4 book ai didi

java : Synchronising ArrayList for multiple operations

转载 作者:行者123 更新时间:2023-12-01 14:51:05 27 4
gpt4 key购买 nike

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

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

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

那么,简单地使用同步块(synchronized block)来控制访问是否可以接受?或者这仍然是禁忌?

我认为我不能使用同步列表。原因是消费者线程批量消费:它首先使用 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 package拥有避免编写自己的代码和重新发明轮子所需的一切。

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

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

编辑:

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

关于java : Synchronising ArrayList for multiple operations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14845392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com