一,概述
CopyOnWriteArrayList作為List接口的實現之一,它區分于ArrayList在于它是線程安全的。如它名字一樣,所有的寫操作均復制了原數組的值,雖說代價較大,但讀多寫少的環境下,是可接受的。筆者在此簡單看下實現原理。
二,實例
三,實現
承載數據存儲的數組,便是array成員,其聲明了volatile,讓其具備原子性、可見性,
1,add
2,get
讀是無鎖操作,因為寫操作僅會復制array,不會對讀產生任何影響,這是重點,
且array聲明了volatile,寫操作完畢后,是可直接拿到已經改變的array。
3,set
set通過clone方式,創建一個副本
4,iter
設計模式中行為性迭代器設計模式,此處當然必不可少,
hasNext,next均無鎖操作,
CopyOnWriteArrayList#Iter是不支持remove,set,add方法實現,畢竟遍歷此List,只在讀的情況下。并且在iter期間,突然的寫操作,是無法影響此Iter,畢竟已經存了snapshot,寫操作的array已經是新值。換句話說,Iter后,不管原CopyOnWriteArrayList內部值如何變化,均不會影響此Iter,snapshot已經獨立。