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

07-27 19:58