arraylist线程安全吗_Java中的集合和线程安全
通過Java指南我們知道Java集合框架(Collection Framework)如何為并發服務,我們應該如何在單線程和多線程中使用集合(Collection)。
話題有點高端,我們不是很好理解。所以,我會盡可能的描述的簡單點。通過這篇指南,你將會對Java集合由更深入的了解,而且我敢保證,這會對你的日常編碼非常有用。
1. 為什么大多數的集合類不是線程安全的?
你注意到了嗎?為什么多數基本集合實現類都不是線程安全的?比如:ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet等等。事實上,所有的集合類(除了Vector和HashTable以外)在java.util包中都不是線程安全的,只遺留了兩個實現類(Vector和HashTable)是線程安全的為什么?
原因是:線程安全消耗十分昂貴!
你應該知道,Vector和HashTable在Java歷史中,很早就出現了,最初的時候他們是為線程安全設計的。(如果你看了源碼,你會發現這些實現類的方法都被synchronized修飾)而且很快的他們在多線程中性能表現的非常差。如你所知的,同步就需要鎖,有鎖就需要時間來監控,所以就降低了性能。
這就是為什么新的集合類沒有提供并發控制,為了保證在單線程中提供最大的性能。
下面測試的程序驗證了Vector和ArrayList的性能,兩個相似的集合類(Vector是線程安全,ArrayList非線程安全)
import java.util.*;/** * This test program compares performance of Vector versus ArrayList * @author www.codejava.net * */public class CollectionsThreadSafeTest { public void testVector() { long startTime = System.currentTimeMillis(); Vector vector = new Vector<>(); for (int i = 0; i < 10_000_000; i++) { vector.addElement(i); } long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; System.out.println("Test Vector: " + totalTime + " ms"); } public void testArrayList() { long startTime = System.currentTimeMillis(); List list = new ArrayList<>(); for (int i = 0; i < 10_000_000; i++) { list.add(i); } long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; System.out.println("Test ArrayList: " + totalTime + " ms"); } public static void main(String[] args) { CollectionsThreadSafeTest tester = new CollectionsThreadSafeTest(); tester.testVector(); tester.testArrayList(); }}通過為每個集合添加1000萬個元素來測試性能,結果如下:
Test Vector: 9266 msTest ArrayList: 4588 ms如你所看到的,在相當大的數據操作下,ArrayList速度差不多是Vector的2倍。你也拷貝上述代碼自己感受下。
2.快速失敗迭代器(Fail-Fast Iterators)
在使用集合的時候,你也要了解到迭代器的并發策略:Fail-Fast Iterators
看下以后代碼片段,遍歷一個String類型的集合:
List listNames = Arrays.asList("Tom總結
以上是生活随笔為你收集整理的arraylist线程安全吗_Java中的集合和线程安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android leak内存,GitHu
- 下一篇: energy in transition