之前说的Immutability模式,将不变性用于解决并发问题,是一种简单的并发问题解决方案,但是适用性并不高
像在Java SDK中,往往不变性都是搭配着CopyOnWrite进行使用,就像replace一样,返回一个全新的对象
之前曾说过CopyOnWirteArrayList和CopyOnWriteArraySet两个容器,设计思想是CopyOnWrite,利用这个思想做到了并发领域的高效读取,但除了这两个,还有着很多其他实现
而且CopyOnWirite的实现在操作系统领域也有着广泛的利用,例如Linux系统中,fork函数在fork给子进程的时候,并不复制整个进程的地址空间,而是父子进程共享一个进程空间,只有在父进程或者子进程写入的时候才会真正的复制
这种情况下,CopyOnWrite更多的体现的是一种延迟策略,只有真正需要的时候,才会进行复制,同时,CopyOnWirte还提供了按需求复制,针对性的进行复制,当然,这是一种消耗大量内存空间的操作
比如Doker在创建镜像的时候也是利用了COW思想,Java8的函数式编程,也是利用了CopyOnWrite
然后是CopyOnWrite思想在Java开发中真实的应用场景
假设一个场景,需要保存相对应的服务提供的状态,可以设置一个CopyOnWriteArraySet来进行适用,我们可以将服务的提供方封装为一个对象,在服务上线或者下线的时候增加或者删除对应的对象,所以很适合读多写少的结构
顺便一提CopyOnWriteArraySet,需要重写equals()方法,这样CopyOnWriteArraySet的add()和remove()才能正常使用
总体来说,CopyOnWrite在并发编程中,具有一席之地,其可以保证高效的读取操作,虽然会消耗一定的内存,但是伴随着现代硬件的发展,已经不再是问题了,也是我们并发操作的常见思路