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

java並發:CopyOnWriteArrayList簡單理解

內存 arr cif spa pen obj boolean iter list

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(); } }

java並發:CopyOnWriteArrayList簡單理解