1. 程式人生 > >java併發:CopyOnWriteArrayList簡單理解

java併發:CopyOnWriteArrayList簡單理解

Java集合的快速失敗機制 “fail-fast”

"fail-fast"是java集合的一種錯誤檢測機制,當多個執行緒對集合進行結構上的改變的操作時,有可能會產生 fail-fast 機制。

例如:假設存在兩個執行緒(執行緒1、執行緒2),執行緒1通過Iterator在遍歷集合A中的元素,在某個時候執行緒2修改了集合A的結構(是結構上面的修改,而不是簡單的修改集合元素的內容),那麼這個時候程式就會丟擲 ConcurrentModificationException 異常,從而產生fail-fast機制。

原因:迭代器在遍歷時直接訪問集合中的內容,並且在遍歷過程中使用一個 modCount 變數。集合在被遍歷期間如果內容發生變化,就會改變modCount的值。每當迭代器使用hashNext()/next()遍歷下一個元素之前,都會檢測modCount變數是否為expectedmodCount值,是的話就返回遍歷;否則丟擲異常,終止遍歷。

 

CopyOnWriteArrayList

傳統的List在多執行緒同時讀寫的時候會丟擲java.util.ConcurrentModificationException,

Vector是執行緒安全的,但是由於使用了synchronized同步鎖,導致同一時間內只有一個執行緒能訪問,效率較低。

而CopyOnWriteArrayList是使用CopyOnWrite(寫時複製)技術解決了這個問題,這一般需要很大的記憶體開銷。

/**
     * Appends the specified element to the end of this list.
     *
     * 
@param e element to be appended to this list * @return {@code true} (as specified by {@link Collection#add}) */ public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements
= Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } }