ArrayList祖能、Vector歉秫、LinkedList
ArrayList是非線程安全的
Vector是線程安全的
LinkedList是單線程下線程安全
然而,我們在實際的開發(fā)過程中养铸,幾乎普遍傾斜于使用ArrayList
而非Vector
雁芙,目的很明確,眼睛很雪亮钞螟,沒錯兔甘,ArrayList
簡單、查詢方便鳞滨,且?guī)缀跄軡M足所有所需要求洞焙,那么在線程安全方面我們該如何選擇呢澡匪?
-
Vector
疑苔,雖然是線程安全的,采用動態(tài)數(shù)組對象實現(xiàn)趁餐,但是我們查看源碼會發(fā)現(xiàn)后雷,其同步安全是針對其所有操作的,所以贾漏,效率會略低梳码,故而不推薦使用。 -
LinkedList
濒蒋,增县好、刪某饰、改 效率較高黔漂,得益于其遍歷中使用的是指針,底層是雙向鏈表結(jié)構(gòu),但線程安全只適用于單線程下鳍置。 -
ArrayList
,get和set的時候效率較高辟拷,采用動態(tài)數(shù)組對象實現(xiàn),有序有索引隅俘,非線程安全
如果我們要做線程安全的集合數(shù)據(jù),那我們可以選擇LinkedList和ArrayList颜骤,
- 線程安全ArrayList:
List<String> list = Collections.synchronizedList(new ArrayList());
- 線程安全LinkedList:
List<String> list = Collections.synchronizedList(new LinkedList());
示例代碼:
list.add("1");
list.add("2");
list.add("3");
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext()) {
System.out.println(i.next());
}
}
看到這里,我們可能要想了嘉熊,為什么我加了線程安全的封裝代碼,怎么遍歷的時候還需要同步代碼塊的存在呢孕惜?因為Collections.synchronizedList
只是對集合add
的操作的時候加了同步瓮栗,其他的操作還是要加上同步代碼的操作,以免其他線程的操作引發(fā)數(shù)據(jù)臟讀秆撮。