Java中的copyOnWrite容器
来源:互联网 发布:杜老师的c编程密码 编辑:程序博客网 时间:2024/05/29 17:50
一、什么是copyOnWrite容器
1)含义:写时拷贝复制。
2)在并发访问的背景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修改完成之后,将指向原来容器的引用指向新的容器(副本容器)。
二、优点
1)支持并发的读,而不需要加锁;
2)读写分离,读和写不同的容器。
二、JDK支持
1)CopyOnWriteArraylList
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return {@code 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;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
2)CopyOnWriteArraySet(省略)
四、使用场景:CopyOnWrite并发容器用于读多写少的并发场景
五、缺点
1)占用内存大:拷贝容器数组导致
2)数据一致性问题:
CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器
六、一个小例子
public class CopyOnWriteListTest {
public static void main(String[] args) throws InterruptedException { final List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<String>(); copyOnWriteArrayList.add("1-old"); copyOnWriteArrayList.add("2-old"); /* * * 读数据线程 * */ new Thread() { @Override public void run() { copyOnWriteArrayList.get(1); } }.start(); /* * * 写数据线程 * */ new Thread(new Runnable() { @Override public void run() { copyOnWriteArrayList.set(1, "1-new"); } }).start(); /* * sleep 等待线程结束. * */ Thread.sleep(2000); System.out.println(copyOnWriteArrayList.get(1));}
}
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的copyOnWrite容器
- 聊聊并发(九)java中的copyonwrite容器
- Java中的CopyOnWrite
- CopyOnWrite容器
- CopyOnWrite容器
- CopyOnWrite容器
- CopyOnWrite容器
- java多线程-专题-聊聊并发(九)Java中的CopyOnWrite容器
- java并发(四) CopyOnWrite容器
- java copyOnWrite
- 34. Search for a Range
- 为什么小城市没有牛逼的研发团队
- 字符串
- XML解析(Dom4j)
- String类的部分实现
- Java中的copyOnWrite容器
- Webapi跨域
- IP与数字的转换
- 《大话设计模式》学习笔记——part1
- select、poll
- DATE_GetFirday
- iOS 重力感应之箭头指向重力方向
- 字符设备驱动--LED驱动程序
- Git的基本知识