CopyOnWriteArrayList実装原理
1106 ワード
CopyOnWriteArrayListは読み効率が高いと聞いていました.実際,CopyOnWriteArrayListはArrayListの同時実装である.
ソースコード:
ADD動作
getアクション
ソースコードを使用すると、書き込み時に最下位のソース配列を新しい配列にコピーし、新しい配列に書き込み、書き終わったらソース配列を更新することがわかります.読むとソース配列で読むだけです.つまり、読み書きは別です.書くたびにソース配列を新しいグループ数にコピーするため、書く効率は高くありません.
結論:CopyOnWriteArrayListは、読み取り操作が書き込み操作よりはるかに大きいシナリオに適している.......
ソースコード:
ADD動作
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return 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;// e
setArray(newElements);//
return true;
} finally {
lock.unlock();
}
}
getアクション
/**
* {@inheritDoc}
*
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public E get(int index) {
return (E)(getArray()[index]);
}
ソースコードを使用すると、書き込み時に最下位のソース配列を新しい配列にコピーし、新しい配列に書き込み、書き終わったらソース配列を更新することがわかります.読むとソース配列で読むだけです.つまり、読み書きは別です.書くたびにソース配列を新しいグループ数にコピーするため、書く効率は高くありません.
結論:CopyOnWriteArrayListは、読み取り操作が書き込み操作よりはるかに大きいシナリオに適している.......