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

发布了60 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaoluo5238/article/details/104366510
今日推荐