赞
踩
核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源的内容时,系统才会真正复制一份专用副本给该调用者,而其他调用者所见到的最初的资源仍然保持不变,这个过程对其他调用者是透明的。
此作法的主要优点是如果调用者没有修改该资源,就不会该副本被建立,因此多个调用者只是读取操作时可以共享同一份资源。
JDK中的CopyOnWriteArrayList/CopyOnWriteArraySet容器也采用了COW思想。
对于不是线程安全的集合类,在并发遍历时候如果有其他线程修改集合,会报ConcurrentModification。
采用COW思想的线程安全的集合就不会抛出ConcurrentModification异常。
Copy-on-write是解决并发的一种思路,指的是实行读写分离,如果执行的是写操作,则复制一个新集合,在新集合内添加或删除元素,待一切修改完成之后,再将原集合的引用指向新的集合。
优点:
1.对于一些读多写少的数据,写时复制的做法就很不错,例如配置、黑名单、物流地址等变化非常少的数据,这是一种无锁的实现,可以帮我们实现程序更高的并发。
2.CopyOnWriteArrayList并发安全且性能比Vector好。Vector是curd方法都加了synchronized来保证同步,但是每个方法执行的时候都要去获得锁,性能就会大大下降,而COW只是在增删改上加锁,读不加锁,在读方面的性能就好于Vector。
缺点:
1.数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。比如线程A在迭代CopyOnWriteArrayList容器的数据,线程B在线程A迭代的间隙中将CopyOnWriteArrayList部分的数据修改了,但是线程A迭代出来的旧数据。
2.内存占用问题。如果CopyOnWriteArrayList经常要增删改里面的数据,并且对象比较大,频繁地写会消耗内存,从而引发Java的GC问题,这个时候,我们应该考虑其他容器,例如ConcurrentHashMap。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。