同步不同类中的ArrayList

时间:2014-10-27 00:05:15

标签: java

所以我知道为了同步一个arrayList你需要使用

 Collections.SynchronizedList(new ArrayList());

但是如果同步的arrayList在一个类中并且我想在其他几个类中引用它,那么多个其他类包含将添加到它的线程。我会做点什么吗

List referenceToList = OtherClass.mainList;   
               // inside OtherClass would be List<String>mainList 
                        = Collections.sychronizedList(new ArrayList<String>());

或者是正确的方式

List referenceToList = Collections.synchronizedList(OtherClass.mainList);

我在迭代列表的方式上是否存在任何差异,或者它是否与所有添加和读取都包含在一个类中相同?

1 个答案:

答案 0 :(得分:1)

列表包含在哪个类中并不重要 - 同步用于控制对来自多个线程的读取和写入该列表的访问(同样,无论其包含在哪个类中)。一旦你打电话给Collections.synchronizedList,就没有必要再做一次了。

为清楚起见(根据您的问题),您的代码如下所示:

class OtherClass {
    public static List mainList = Collections.synchronizedList(new ArrayList());
}

class RandomClass {
    public static List referenceToList = OtherClass.mainList;
}

这里,referenceToList只是指向mainList指向的同一列表的指针,它具有同步的读/写访问权限。

请注意,还有其他List实现专为并发访问情况而设计,例如CopyOnWriteArrayList