在Java中同步ArrayList的正确方法
我不确定这是否是同步我的的正确方法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)使用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