[JAVA学习笔记-61]CopyOnWriteArrayList
来源:互联网 发布:西游记源码 编辑:程序博客网 时间:2024/05/19 05:38
某个线程使用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错误。
0 0
- [JAVA学习笔记-61]CopyOnWriteArrayList
- CopyOnWriteArrayList学习笔记
- JAVA 笔记 CopyOnWriteArrayList
- 疯狂Java学习笔记(81)-----------并发容器之CopyOnWriteArrayList
- Java学习笔记(81)-----------并发容器之CopyOnWriteArrayList
- JAVA学习---集合系列---CopyOnWriteArrayList
- 深入Java集合学习系列:CopyOnWriteArrayList详解
- 深入Java集合学习系列:CopyOnWriteArrayList详解
- java CopyOnWriteArrayList
- 【Java】CopyOnWriteArrayList
- 深入学习java并发编程:CopyOnWriteArrayList<E>实现
- java学习(3)concurrenthashmap hashtable hashmap copyonwritearraylist weakHashMap待续
- Java Concurrent --CopyOnWriteArrayList
- java CopyOnWriteArrayList的使用
- java.util.concurrent.CopyOnWriteArrayList
- java CopyOnWriteArrayList的使用
- java CopyOnWriteArrayList使用
- java CopyOnWriteArrayList的使用
- 第五周计算矩形的面积
- JQuery
- Java算法1-- 阶乘和斐波那契数列
- vim键盘图
- 第三章 改进神经网络学习方法
- [JAVA学习笔记-61]CopyOnWriteArrayList
- 第五、六章 深度学习
- 第五周 项目一(7)判断N并计算(Raptor)
- 模态框
- 第四周-4圆柱表面积
- AJAX
- 第五周—双分支
- ExpandableListView 会出现的问题
- 第五周项目—raptor圆的周长