java vector的多線程安全是否有用

在網上搜了很多文章,發現有很多沒講清楚的,也有很多好文,本文但願更易懂地描述該問題。若有不對的地方,請多多指正~~安全

vector的使用主要有以下兩種場景:
(1)vector所謂的多線程安全,只是針對單純地調用某個方法它是有同步機制的。如add,多個線程都在對同一個容器add元素,vector可以保證最後總數是正確的,而ArrayList沒有同步機制,就沒法保證。
(2)vector的多線程安全,在組合操做時不是線程安全的。好比一個線程先調用vector的size方法獲得有10個元素,再調用get(9)方法獲取最後一個元素,而另外一個線程調用remove(9)方法正好刪除了這個元素,那第一個線程就會拋越界異常。多線程

總結:
(1)在須要對容器進行組合操做時,vector不適用(須要本身用synchronized將組合操做進行同步);
(2)僅在上述第一種場景時,才須要使用vectoride

public class TestMultiThread {線程

private static Vector<Integer> vec = new Vector<Integer>();
private static List<Integer> lst = new ArrayList<Integer>();

public void f() {
    TestThread testThread1 = new TestThread();
    TestThread testThread2 = new TestThread();
    Thread thread1 = new Thread(testThread1);
    Thread thread2 = new Thread(testThread2);
    thread1.start();
    thread2.start();
}

public static void main(String[] args) {
    TestMultiThread testMultiThread = new TestMultiThread();
    testMultiThread.f();
    
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("vec size is " + vec.size());
    System.out.println("lst size is " + lst.size());

}

private class TestThread implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 1000; ++i) {
            vec.add(i);
            lst.add(i);
        }
    }
}

}code

如上程序運行結果:
vec size is 2000
lst size is 1999rem

相關文章
相關標籤/搜索