当前位置:   article > 正文

写时复制了解吗(并发场景下)_写时复制技术在什么情况下最能发挥其优势

写时复制技术在什么情况下最能发挥其优势

写时复制(Copy On Write)

核心思想是,如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),会共同获取相同的指针指向相同的资源,直到某个调用者视图修改资源的内容时,系统才会真正复制一份专用副本给该调用者,而其他调用者所见到的最初的资源仍然保持不变,这个过程对其他调用者是透明的。

此作法的主要优点是如果调用者没有修改该资源,就不会该副本被建立,因此多个调用者只是读取操作时可以共享同一份资源。

Java中的COW

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。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/821941
推荐阅读
相关标签
  

闽ICP备14008679号