所以我知道为了同步一个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);
我在迭代列表的方式上是否存在任何差异,或者它是否与所有添加和读取都包含在一个类中相同?
答案 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
。