在Java中同步ArrayList的正确方法

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

我有一个ArrayListin_queueregisterInQueue函数传递过来的。

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)使用Using

这样做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中同步ArrayList的正确方法 的全部内容, 来源链接: utcz.com/qa/406429.html

回到顶部