[JAVA学习笔记-61]CopyOnWriteArrayList
2016-09-29 08:34
465 查看
某个线程使用Iterator遍历该List时,若有另外一个线程对其修改,实际修改的是内存中的一份拷贝,对Iterator操作无影响,从而规避了
并发操作的问题。
缺点:
1、消耗更多的内存
优点:
1、在大量读操作的,改动操作较少的应用场景,可以规避阻塞,等待,提高读取效率;
注意区别读写锁,读写锁在写操作的时候,读操作是被阻塞的,只有读操作可以并发。
问题:
1、因为读/写在不同的内存块中进行,如果预期写入在读之前,即,预期读的数据包含要写入的数据,则可能因为racing condition导致
读不到期望的数据(例如写完成之前,读操作已经开始了)
例子:
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray(); //获取当前的ArrayList的数据
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1); //拷贝到新的内存块中,多拷贝一块内存
newElements[len] = e; //将要添加的对象添加到新的内存块的结尾
setArray(newElements); //将新的内存块作为当前的ArrayList的数据源
return true;
} finally {
lock.unlock();
}
}
用到了Arrays.copyOf 方法。这样导致每次操作的都不是同一个引用。也就不会出现java.util.ConcurrentModificationException错误。
并发操作的问题。
缺点:
1、消耗更多的内存
优点:
1、在大量读操作的,改动操作较少的应用场景,可以规避阻塞,等待,提高读取效率;
注意区别读写锁,读写锁在写操作的时候,读操作是被阻塞的,只有读操作可以并发。
问题:
1、因为读/写在不同的内存块中进行,如果预期写入在读之前,即,预期读的数据包含要写入的数据,则可能因为racing condition导致
读不到期望的数据(例如写完成之前,读操作已经开始了)
例子:
public boolean add(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray(); //获取当前的ArrayList的数据
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1); //拷贝到新的内存块中,多拷贝一块内存
newElements[len] = e; //将要添加的对象添加到新的内存块的结尾
setArray(newElements); //将新的内存块作为当前的ArrayList的数据源
return true;
} finally {
lock.unlock();
}
}
用到了Arrays.copyOf 方法。这样导致每次操作的都不是同一个引用。也就不会出现java.util.ConcurrentModificationException错误。
相关文章推荐
- JAVA 笔记 CopyOnWriteArrayList
- JAVA学习---集合系列---CopyOnWriteArrayList
- 深入Java集合学习系列:CopyOnWriteArrayList详解
- CopyOnWriteArrayList 学习笔记
- 深入学习java并发编程:CopyOnWriteArrayList<E>实现
- Java高并发程序设计笔记(六)之CopyOnWriteArrayList与BlockingQuene
- java CopyOnWriteArrayList的使用
- Java 7之多线程并发容器 - CopyOnWriteArrayList
- java CopyOnWriteArrayList
- 《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet
- Java concurrent Framework并发容器之CopyOnWriteArrayList(1.6)源码分析
- Java Concurrent --CopyOnWriteArrayList
- Java 容器类学习笔记1--了解Java提供的容器类List、ArrayList、Vector及map、HashTable、HashMap
- java.util中ArralyList 与 CopyOnWriteArrayList
- Java学习笔记51:数组转ArrayList和ArrayList转数组技巧
- 关于java CopyOnWriteArrayList 性能测试
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
- java CopyOnWriteArrayList的使用
- Java中 CopyOnWriteArrayList 的使用
- Java中 CopyOnWriteArrayList 的使用