ArrayList
眾所周知ArrayList是非線程安全的,在多線程的情況下,向list插入數據的時候,可能會造成數據丟失的情況.並且一個線程在遍歷List,另一個線程修改List,會報ConcurrentModificationException(並發修改異常)錯誤.
Vector
Vector是一個線程安全的List,但是它的線程安全實現方式是對所有操作都加上了synchronized關鍵字,這種方式嚴重影響效率.所以並不推薦使用Vector.
Collections.synchronizedList(List list)
要實現List的線程安全,可以使用 Collections.synchronizedList,先看一下它的使用方法.
List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("1");
list.add("2");
list.add("3");
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext()) {
//foo(i.next());
System.out.println(i.next());
}
}
翻看源碼Collections.synchronizedList->SynchronizedList可以發現add方法加了鎖,所以add時我們就不用加鎖;遍歷時則避免數據被其他線程串改,所以加鎖保護;
synchronizedList在迭代的時候,需要開發者自己加上線程鎖控制代碼,因為在整個迭代的過程中如果在循環外面不加同步代碼,在一次次迭代之間,其他線程對於這個容器的add或者remove會影響整個迭代的預期效果,所以這里需要用戶在整個循環外面加上synchronized(list);