写时复制了解吗(并发场景下)

写时复制(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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值