CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy(这里拷贝会创建新的对象),复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种 可以看到写的时候还是避免不了同步的 而读是没有锁的, 瞎读后果自负 综上, Copy-On-Writ
e是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种读写分离的思想, 向并发安全性做的妥协。什么是CopyOnWrite容器
读写分离
的思想,读和写不同的容器
, 但是相当于牺牲了读写一致性
来提升并发安全性, 因为读永远都是没有锁的, 但是一旦有在写的副本, 就会读到脏数据.CopyOnWriteArrayList的实现原理(源码)
// 读 public E get(int index) { // 读并没有加锁 return (E) elements[index]; } // 写 public synchronized boolean add(E e) { // 复制出新数组 Object[] newElements = new Object[elements.length + 1]; // 拷贝数组 System.arraycopy(elements, 0, newElements, 0, elements.length); // 向新数组中添加数据 newElements[elements.length] = e; // 引用重新赋值 elements = newElements; return true; }
@SuppressWarnings("unchecked") private E get(Object[] a, int index) { return (E) a[index]; } /** * {@inheritDoc} * * @throws IndexOutOfBoundsException {@inheritDoc} */ public E get(int index) { return get(getArray(), index); }
CopyOnWrite的缺点
CopyOnWrite
容器存在两个问题,即内存占用问题和数据一致性问题。
因为CopyOnWrite的写时复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象(注意:在复制的时候只是复制容器里的引用,只是在写的时候会创建新对象添加到新容器里,而旧容器的对象还在使用,所以有两份对象内存)。如果这些对象占用的内存比较大,比如说200M左右,那么再写入100M数据进去,内存就会占用300M,那么这个时候很有可能造成频繁的Yong GC和Full GC。针对内存占用问题,可以通过压缩容器中的元素的方法来减少大对象的内存消耗,比如,如果元素全是10进制的数字,可以考虑把它压缩成36进制或64进制。或者不使用CopyOnWrite容器,而使用其他的并发容器,如ConcurrentHashMap
。
CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。CopyOnWriteArrayList
和CopyOnWriteArraySet
, 这两个COW类适合高并发只读
+保持少量数据
+低数据量高并发写入
+避免实时读(边写边读)
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算