1. 程式人生 > >Java併發程式設計:併發容器之CopyOnWriteArrayList

Java併發程式設計:併發容器之CopyOnWriteArrayList

原文連結:

  Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開始Java併發包裡提供了兩個使用CopyOnWrite機制實現的併發容器,它們是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非常多的併發場景中使用到。

什麼是CopyOnWrite容器

  CopyOnWrite容器即寫時複製的容器。通俗的理解是當我們往一個容器新增元素的時候,不直接往當前容器新增,而是先將當前容器進行Copy,複製出一個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對CopyOnWrite容器進行併發的讀,而不需要加鎖,因為當前容器不會新增任何元素。所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

CopyOnWriteArrayList的實現原理

  在使用CopyOnWriteArrayList之前,我們先閱讀其原始碼瞭解下它是如何實現的。以下程式碼是向CopyOnWriteArrayList中add方法的實現(向CopyOnWriteArrayList裡新增元素),可以發現在新增的時候是需要加鎖的,否則多執行緒寫的時候會Copy出N個副本出來。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (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(); } }

   讀的時候不需要加鎖,如果讀的時候有多個執行緒正在向CopyOnWriteArrayList新增資料,讀還是會讀到舊的資料,因為寫的時候不會鎖住舊的CopyOnWriteArrayList。

1 2 3 public E get(int index) { return get(getArray(), index); }

   JDK中並沒有提供CopyOnWriteMap,我們可以參考CopyOnWriteArrayList來實現一個,基本程式碼如下:

1 2 3 4 5

相關推薦

【34】Java併發程式設計併發容器CopyOnWriteArrayList(轉載)

Java併發程式設計:併發容器之CopyOnWriteArrayList(轉載)   原文連結:   http://ifeve.com/java-copy-on-write/      Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都

11-Java併發程式設計併發容器CopyOnWriteArrayList(轉載)

Java併發程式設計:併發容器之CopyOnWriteArrayList(轉載)   原文連結:   Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容

Java併發程式設計併發容器CopyOnWriteArrayList(轉載)

  原文連結:   Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開始J

Java併發程式設計併發容器CopyOnWriteArrayList

原文連結:   Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開

【轉】Java併發程式設計併發容器ConcurrentHashMap

  JDK5中添加了新的concurrent包,相對同步容器而言,併發容器通過一些機制改進了併發效能。因為同步容器將所有對容器狀態的訪問都序列化了,這樣保證了執行緒的安全性,所以這種方法的代價就是嚴重降低了併發性,當多個執行緒競爭容器時,吞吐量嚴重降低。因此Java5.0開始針對多執行緒併發訪問設計,提供了併

10-Java併發程式設計併發容器ConcurrentHashMap(轉載)

Java併發程式設計:併發容器之ConcurrentHashMap(轉載)   下面這部分內容轉載自:   JDK5中添加了新的concurrent包,相對同步容器而言,併發容器通過一些機制改進了併發效能。因為同步容器將所有對容器狀態的訪問都 序列化了,這樣保證了執

Java併發程式設計併發容器ConcurrentHashMap

下面這部分內容轉載自:   JDK5中添加了新的concurrent包,相對同步容器而言,併發容器通過一些機制改進了併發效能。因為同步容器將所有對容器狀態的訪問都 序列化了,這樣保證了執行緒的安全性,所以這種方法的代價就是嚴重降低了併發性,當多個執行緒

【轉】Java併發程式設計同步容器

  為了方便編寫出執行緒安全的程式,Java裡面提供了一些執行緒安全類和併發工具,比如:同步容器、併發容器、阻塞佇列、Synchronizer(比如CountDownLatch)。今天我們就來討論下同步容器。   一、為什麼會出現同步容器?   在Java的集合容器框架中,主要有四大類別:Li

(2.1.27.1)Java併發程式設計併發

在物理計算機中CPU為了提高處理速度,添加了快取記憶體與CPU亂序執行 一、 併發的起源 為了提高計算機處理資料的速度,現代的計算機都支援多工處理。 在32位windows作業系統中 ,多工處理是指系統可同時執行多個程序,而每個程序也可同時執行多個執行

Java並發--並發容器CopyOnWriteArrayList

數據 ice log 個人 one map 正在 jdk null 原文鏈接:http://ifeve.com/java-copy-on-write/     Copy-On-Write簡稱COW,是一種用於程序設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容

併發程式設計併發Queue介面

佇列是一種先進先出或者後進後出的資料結構。在此我們模擬一下佇列這種資料結構: MyQueue.java定義如下: public class MyQueue { //佇列的容器 private LinkedList<Object> list = new L

java併發程式設計CopyOnWriteArrayList

  Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開始Java併發包裡提供了兩個使用CopyOnWrite機制

Java併發(十八)阻塞佇列BlockingQueue BlockingQueue(阻塞佇列)詳解 二叉堆(一) 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞、併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue(阻塞佇列)詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

(2.1.27.11)Java併發程式設計LockReentrantReadWriteLock 讀寫分離獨享式重入鎖

我們在介紹AbstractQueuedSynchronizer的時候介紹過,AQS支援獨佔式同步狀態獲取/釋放、共享式同步狀態獲取/釋放兩種模式,對應的典型應用分別是ReentrantLock和Semaphore AQS還可以混合兩種模式使用,讀寫鎖Reent

(2.1.27.13)Java併發程式設計LockCountDownLatch計數式獨享鎖

CountDownLatch是一種java.util.concurrent包下一個同步工具類,它允許一個或多個執行緒等待直到在其他執行緒中一組操作執行完成。 相對於前文的鎖,它主要實現了: 呼叫指定次release後,才會釋放鎖 一、使用 public st

(2.1.27.16)Java併發程式設計LockConcurrentHashMap

ConcurrentHashMap 和 HashMap 的底層實現都是 陣列+連結串列或紅黑樹 構成的。 HashMap 的原始碼分析見:Java集合框架——HashMap原始碼分析 ConcurrentHashMap 相比 HashMap 支援多執行緒下的操

Java併發程式設計Copy-On-Write容器

Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然後再改,這是一種延時懶惰策略。從JDK1.5開始Java併發包裡提供了兩個使用CopyOnWrite

Java併發程式設計volatile關鍵字解析

volatile這個關鍵字可能很多朋友都聽說過,或許也都用過。在Java 5之前,它是一個備受爭議的關鍵字,因為在程式中使用它往往會導致出人意料的結果。在Java 5之後,volatile關鍵字才得以重獲生機。   volatile關鍵字雖然從字面上理解起來比較簡單,但是要

java併發程式設計守護執行緒(Daemon)

在Java中有兩類執行緒:User Thread(使用者執行緒)、Daemon Thread(守護執行緒) 用個比較通俗的比喻,任何一個守護執行緒都是整個JVM中所有非守護執行緒的保姆:只要當前JVM例項中尚存在任何一個非守護執行緒沒有結束,守護執行緒就全部工作;只有當最後一

JAVA併發程式設計一文全面搞懂併發程式設計

序言 哈哈哈哈哈哈,原諒我這個標題黨哈,我現在也只是剛入門併發程式設計,學習的過程過程中發現好多專業詞語不會讀或者是讀不準。。所以就彙總了下,把一些比較難讀的給標上英標啦。。 正文 callable:['kɔ:ləbl]  一個類似runnable的介面,方法可以有返回值