我不确定这是否是同步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()
只是无用的额外开销。