高并发容器--CopyOnWrite
来源:互联网 发布:阿里云acp培训 编辑:程序博客网 时间:2024/05/21 07:54
—–CopyOnWrite容器即写时复制的容器。通俗的讲就是往容器里面写数据的时候,不再当前容器写数据,而是将当前的容器拷贝一份,往拷贝新的容器里面写数据,添加完元素后,再将原容器指向新的容器。这样做的好处就是,并发读的时候不需要加锁,因为当前容器没有添加任何元素,不过写的时候需要加锁,所以CopyOnWrite也是一种读写分离的思想,适用于读多写少的并发场景,CopyOnWriteArrayList采用“写入时复制”策略,对容器的写操作将导致的容器中基本数组的复制,性能开销较大。所以在有写操作的情况下,CopyOnWriteArrayList性能不佳,而且如果容器容量较大的话容易造成溢出。
public class Test1 {
final static CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList();final static AtomicInteger atomicInteger = new AtomicInteger(3);public static void main(String[] args) { List<String> lists = Lists.newArrayList(); lists.add("1"); lists.add("2"); //整体加入会更好,单个加入需要消耗大量性能 copyOnWriteArrayList.addAll(lists); product(); comsumer(); try { TimeUnit.MINUTES.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }}static void product() { for (int i = 0; i < 5; i++) { new Thread(() -> { try { TimeUnit.NANOSECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } copyOnWriteArrayList.add(atomicInteger.incrementAndGet()+""); }).start(); }}static void comsumer() { //读多写少 for (int i = 0; i < 10000; i++) { new Thread(() -> { System.out.println(copyOnWriteArrayList.toString()); }).start(); }}
}
CopyOnWrite的缺点
内存占用的问题:CopyOnWrite写的复制机制,导致在写的时候内存存在两份对象(注意:在复制的时候只是复制容器对象的引用,只是在写的时候会在创建一个新对象添加到新的容器里,而旧的容器还在使用)。如果这些对象比较大,那么这个时候很可能造成频繁Yong GC和Full GC,针对这种大对象内存占用问题,可以通过压缩容器的元素来减少大对象的内存消耗,比如10进制变成36进制。或者不使用CopyOnWrite,而使用其它并发容器,ConcurrentHashMap。
数据一致性问题:由于采用了读写分离的思想,所以读和写可能获取的数据是不一样的,它只能保证数据的最终一致性,不能保证数据的实时一致性。
0 0
- 高并发容器--CopyOnWrite
- 并发容器CopyOnWrite
- 并发容器——CopyOnWrite
- java并发(四) CopyOnWrite容器
- 聊聊并发(九)java中的copyonwrite容器
- CopyOnWrite容器
- CopyOnWrite容器
- CopyOnWrite容器
- CopyOnWrite容器
- 并发编程复习(七):并发类容器ConcurrentHashMap&CopyOnWrite
- Java多线程之并发容器:CopyOnWrite到底干啥用的
- Java并发包中CopyOnWrite容器相关类简介
- Java并发包中CopyOnWrite容器相关类简介
- Java并发编程札记-(五)JUC容器-02CopyOnWrite
- Java多线程之并发容器:CopyOnWrite到底干啥用的
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- Java中的CopyOnWrite容器
- 【Android应用】 6.0代码申请权限 向SD卡写入文件
- CSS 定位总结
- 排序算法总结
- 读代码犹如读诗词歌赋,慢慢读,仔细读
- 解决脚本不能使用onchange的问题
- 高并发容器--CopyOnWrite
- 阿里旺旺聊天发包CALL发送消息
- 机器学习开源库总结
- sql中left join 和 right join的区别基础举例,仅供辨识
- 中心认证服务(CAS)入门(一)
- Word Break
- AppCompatActivity与toolbar结合的详细使用
- nginx 404及5xx页面配置
- android中怎么在文字两边划线