java List和Vector的線程安全性比較

List 線程不安全,其中的操作不是原子操作
Vector 是線程安全的,其中的操作有sync修飾,爲同步操作

/**
 * 對比 list 和 vector 線程安全
 */
public class ListVectorSaveTest {
    ArrayList<String> dataList = new ArrayList<>();//arrayList線程不安全
    Vector<String> vector = new Vector<>();//vector
    /**
     * list 線程不安全,其中的操作比如add等非原子操作
     */
    public void testList(){
        //有100個線程往裏面各加100次
        for (int i = 0;i < 100; i++){
            new Thread(()->{
               for (int j =0;j < 100;j++){
                    dataList.add("1");//非原子操作,線程不安全
                }
            }).start();
        }
        try {
            Thread.sleep(5000);//等待5秒,確保運行完了
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("dataList Size應該有 10000,現有 Size:"+ dataList.size());
        //dataList Size應該有 10000,現有 Size:9877

        /**
         * 此處會偶爾出現報錯,原因是 list是線程不安全的,在多線程的情況下,其中的add會出現數組越界等情況
         Exception in thread "Thread-1" java.lang.ArrayIndexOutOfBoundsException: 17
         at java.util.ArrayList.add(ArrayList.java:444)
         at com.teligen.dazt.learn.ListVectorSaveTest.lambda$testList$0(ListVectorSaveTest.java:16)
         at com.teligen.dazt.learn.ListVectorSaveTest$$Lambda$1/500977346.run(Unknown Source)
         at java.lang.Thread.run(Thread.java:745)
         dataList Size:91
         */
    }

    public void testVector(){
        //有100個線程往裏面各加100次
        for (int i = 0;i < 100; i++){
            new Thread(()->{
                for (int j =0;j < 100;j++){
                    vector.add("1");//加了同步器,是線程安全的
                }
            }).start();
        }
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("vector Size應該有 10000,現有 Size:"+ vector.size());
        //運行結果 vector Size應該有 10000,現有 Size:10000
    }



    public static void main(String[] args) {
        ListVectorSaveTest test = new ListVectorSaveTest();
        test.testList();
        test.testVector();
    }

}

dataList Size應該有 10000,現有 Size:9852
vector Size應該有 10000,現有 Size:10000

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章