Collections.synchronizedList使用方法


ArrayList

眾所周知ArrayList是非線程安全的,在多線程的情況下,向list插入數據的時候,可能會造成數據丟失的情況.並且一個線程在遍歷List,另一個線程修改List,會報ConcurrentModificationException(並發修改異常)錯誤.

Vector

Vector是一個線程安全的List,但是它的線程安全實現方式是對所有操作都加上了synchronized關鍵字,這種方式嚴重影響效率.所以並不推薦使用Vector.

Collections.synchronizedList(List list)

要實現List的線程安全,可以使用 Collections.synchronizedList,先看一下它的使用方法.

List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("1");
list.add("2");
list.add("3");

synchronized (list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext()) {
        //foo(i.next());
        System.out.println(i.next());
    }
}

翻看源碼Collections.synchronizedList->SynchronizedList可以發現add方法加了鎖,所以add時我們就不用加鎖;遍歷時則避免數據被其他線程串改,所以加鎖保護;

synchronizedList在迭代的時候,需要開發者自己加上線程鎖控制代碼,因為在整個迭代的過程中如果在循環外面不加同步代碼,在一次次迭代之間,其他線程對於這個容器的add或者remove會影響整個迭代的預期效果,所以這里需要用戶在整個循環外面加上synchronized(list);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM