java併發之CopyOnWriteArrayList
CopyOnWriteArrayList是執行緒安全的、並且讀操作無鎖的ArrayList。
不像ArrayList預設初始化大小為10的Object[],CopyOnWriteArrayList預設初始化大小為0的Object[]
1,add(E)
add方法沒有給整個方法加synchronized關鍵字,而是使用ReentrantLock來保證執行緒安全。
該方法和ArrayList的add方法不同,ArrayList在add時候如果List中元素個數超出Object[]大小,則擴容,預設擴容1.5倍,而CopyOnWriteArrayList是新建立一個比原來大1的陣列,然後將新元素放在最後。
2,remove(E)
在ArrayList的remove方法中,程式碼如下:
點選(此處)摺疊或開啟
-
public E remove(int index) {
-
...
-
E oldValue = (E) elementData[index];
-
int numMoved = size - index - 1;
-
if (numMoved > 0)
-
System.arraycopy(elementData, index+1, elementData, index,
-
numMoved);
-
elementData[--size] = null; // Let gc do its work
-
return oldValue;
- }
從程式碼可以看出,ArrayList是直接操作原陣列,利用 System.arraycopy將index之後的元素往前挪。
而在CopyOnWriteArrayList的remove中,和add方法一樣,也是透過ReentrantLock保證執行緒安全,程式碼如下:
點選(此處)摺疊或開啟
-
public E remove(int index) {
-
final ReentrantLock lock = this.lock;
-
lock.lock();
-
try {
-
Object[] elements = getArray();
-
int len = elements.length;
-
Object oldValue = elements[index];
-
int numMoved = len - index - 1;
-
if (numMoved == 0)
-
setArray(Arrays.copyOf(elements, len - 1));
-
else {
-
Object[] newElements = new Object[len - 1];
-
System.arraycopy(elements, 0, newElements, 0, index);
-
System.arraycopy(elements, index + 1, newElements, index,numMoved);
-
setArray(newElements);
-
}
-
return (E)oldValue;
-
} finally {
-
lock.unlock();
-
}
- }
從程式碼可以看出,CopyOnWriteArrayList新建立了一個大小比原來小1的新陣列,然後利用System.arraycopy將原陣列index前後分兩次複製至新陣列。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-1133900/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java併發包之 CopyOnWriteArrayListJava
- Java併發-CopyOnWriteArrayListJava
- 併發容器之CopyOnWriteArrayList
- java併發資料結構之CopyOnWriteArrayListJava資料結構
- Java併發指南14:Java併發容器ConcurrentSkipListMap與CopyOnWriteArrayListJava
- java集合之CopyOnWriteArrayListJava
- 併發包系列二—— CopyOnWriteArrayList
- 原始碼|併發一枝花之CopyOnWriteArrayList原始碼
- java併發之synchronizedJavasynchronized
- Java併發之ExecutorJava
- 死磕 java集合之CopyOnWriteArrayList原始碼分析Java原始碼
- Java併發之ConcurrentHashMapJavaHashMap
- Java JUC CopyOnWriteArrayList 解析Java
- java併發之ConcurrentLinkedQueueJava
- java併發之hashmap原始碼JavaHashMap原始碼
- Java併發之AQS原理剖析JavaAQS
- Java併發之AQS詳解JavaAQS
- Java併發系列之volatileJava
- Java 併發包之CountDownLatch、CyclicBarrierJavaCountDownLatch
- Java併發之顯式鎖Java
- Java之併發三問題Java
- java中CopyOnWriteArrayList詳解Java
- Java併發程式設計之Java CAS操作Java程式設計
- Java併發之等待/通知機制Java
- java併發面試常識之copyonwriteJava面試
- Java併發之CompletionService詳解Java
- java併發之SynchronousQueue實現原理Java
- Java併發程式設計之synchronizedJava程式設計synchronized
- Java高併發之CyclicBarrier簡介Java
- Java併發之Executor + Callable + FutureJava
- Java併發之CountDownLatch、CyclicBarrier和SemaphoreJavaCountDownLatch
- Java 併發模式之Master-WorkerJava模式AST
- java併發筆記之java執行緒模型Java筆記執行緒模型
- 【Java系列】Java併發之 Race Condition and Critical SectionJava
- jdk原始碼分析之CopyOnWriteArrayListJDK原始碼
- Java併發之同步器設計Java
- JAVA併發之阻塞佇列淺析Java佇列
- Java高併發之synchronized關鍵字Javasynchronized