gpt4 book ai didi

java - 在java中同步ArrayList的正确方法

转载 作者:IT老高 更新时间:2023-10-28 20:55:21 25 4
gpt4 key购买 nike

我不确定这是否是同步我的 ArrayList 的正确方法。

我有一个 ArrayList in_queue,它是从 registerInQueue 函数传入的。

ArrayList<Record> in_queue = null;

public void registerInQueue(ArrayList in_queue)
{
this.in_queue = in_queue;
}

现在我正在尝试同步它。这是否正确地同步了我的 in_queue 对象?

List<Record> in_queue_list = Collections.synchronizedList(in_queue);

synchronized (in_queue_list) {
while (in_queue_list.size() > 0) {
in_queue_list.remove(0);
}
}

最佳答案

您要同步两次,这是没有意义的,并且可能会减慢代码速度:迭代列表时的更改需要对整个操作进行同步,您正在使用 synchronized (in_queue_list) 使用Collections.synchronizedList() 在这种情况下是多余的(它创建了一个同步各个操作的包装器)。

但是,由于您要完全清空列表,因此迭代删除第一个元素是最糟糕的方法,因为每个元素都必须复制所有后续元素,因此这是 O(n^2)操作 - 对于较大的列表来说非常慢。

相反,只需调用 clear() - 无需迭代。

编辑:如果以后需要Collections.synchronizedList()的单方法同步,那么这个方法是正确的:

List<Record> in_queue_list = Collections.synchronizedList(in_queue);
in_queue_list.clear(); // synchronized implicitly,

但在很多情况下,单方法同步是不够的(例如对于所有迭代,或者当你得到一个值时,基于它进行计算,并用结果替换它)。在这种情况下,无论如何您都必须使用手动同步,因此 Collections.synchronizedList() 只是无用的额外开销。

关于java - 在java中同步ArrayList的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1431681/

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