CopyOnWriteArrayList
除了加鎖外,其實還有一種方式可以防止併發修改異常,這就是將讀寫分離技術(不是資料庫上的)。
先回顧一下一個常識:
1、JAVA中“=”操作只是將引用和某個物件關聯,假如同時有一個執行緒將引用指向另外一個物件,一個執行緒獲取這個引用指向的物件,那麼他們之間不會發生ConcurrentModificationException,他們是在虛擬機器層面阻塞的,而且速度非常快,幾乎不需要CPU時間。
2、JAVA中兩個不同的引用指向同一個物件,當第一個引用指向另外一個物件時,第二個引用還將保持原來的物件。
基於上面這個常識,我們再來探討下面這個問題:
在CopyOnWriteArrayList裡處理寫操作(包括add、remove、set等)是先將原始的資料通過JDK1.6的Arrays.copyof()來生成一份新的陣列,然後在新的資料物件上進行寫,寫完後再將原來的引用指向到當前這個資料物件(這裡應用了常識1),這樣保證了每次寫都是在新的物件上(因為要保證寫的一致性,這裡要對各種寫操作要加一把鎖,JDK1.6在這裡用了重入鎖),然後讀的時候就是在引用的當前物件上進行讀(包括get,iterator等),不存在加鎖和阻塞,針對iterator使用了一個叫COWIterator的閹割版迭代器,因為不支援寫操作,當獲取CopyOnWriteArrayList的迭代器時,是將迭代器裡的資料引用指向當前引用指向的資料物件,無論未來發生什麼寫操作,都不會再更改迭代器裡的資料物件引用,所以迭代器也很安全(這裡應用了常識2)。
CopyOnWriteArrayList中寫操作需要大面積複製陣列,所以效能肯定很差,但是讀操作因為操作的物件和寫操作不是同一個物件,讀之間也不需要加鎖,讀和寫之間的同步處理只是在寫完後通過一個簡單的“=”將引用指向新的陣列物件上來,這個幾乎不需要時間,這樣讀操作就很快很安全,適合在多執行緒裡使用,絕對不會發生ConcurrentModificationException,所以最後得出結論:CopyOnWriteArrayList適合使用在讀操作遠遠大於寫操作的場景裡,比如快取。
相關文章
- 剖析 CopyOnWriteArrayList
- 認識CopyOnWriteArrayList
- CopyOnWriteArrayList詳解
- CopyOnWriteArrayList原始碼解析原始碼
- Java併發-CopyOnWriteArrayListJava
- Java JUC CopyOnWriteArrayList 解析Java
- java集合之CopyOnWriteArrayListJava
- HashSet、TreeSet、CopyOnWriteArraySet和CopyOnWriteArrayList
- java中CopyOnWriteArrayList詳解Java
- 併發容器之CopyOnWriteArrayList
- java併發之CopyOnWriteArrayListJava
- 圖解集合3:CopyOnWriteArrayList圖解
- Java併發包之 CopyOnWriteArrayListJava
- 併發包系列二—— CopyOnWriteArrayList
- jdk原始碼分析之CopyOnWriteArrayListJDK原始碼
- CopyOnWriteArrayList原始碼閱讀筆記原始碼筆記
- 【雜談】對CopyOnWriteArrayList的認識
- Java集合乾貨——CopyOnWriteArrayList原始碼分析Java原始碼
- 33-CopyOnWriteArrayList 有什麼特點?
- 死磕 java集合之CopyOnWriteArrayList原始碼分析Java原始碼
- 面試必問之 CopyOnWriteArrayList,你瞭解多少?面試
- JUC——安全容器類(CopyOnWriteArrayList,CopyOnWriteArraySet 和 ConcurrentHashMap)HashMap
- java併發資料結構之CopyOnWriteArrayListJava資料結構
- 走進原始碼——CopyOnWriteArrayList閱讀筆記原始碼筆記
- CopyOnWriteArrayList你都不知道,怎麼拿offer?
- 原始碼|併發一枝花之CopyOnWriteArrayList原始碼
- 先簡單說一說Java中的CopyOnWriteArrayListJava
- Java併發指南14:Java併發容器ConcurrentSkipListMap與CopyOnWriteArrayListJava
- ArrayList執行緒不安全怎麼辦?(CopyOnWriteArrayList詳解)執行緒
- Doug Lea大師的佳作CopyOnWriteArrayList,用不好能坑死你!
- 因為不知道Java的CopyOnWriteArrayList,面試官讓我回去等通知Java面試
- 為什麼執行緒安全的List推薦使用CopyOnWriteArrayList,而不是Vector執行緒
- 【追光者系列】HikariCP原始碼分析之ConcurrentBag&J.U.C SynchronousQueue、CopyOnWriteArrayList原始碼