【Design Pattern】Concurrency - Copy-on-write Pattern

Posted by 西维蜀黍 on 2021-11-02, Last Modified on 2023-02-22

Copy-on-write

于在传统的使用读写锁以保证互斥操作的实现中,通常会在进行写操作时加锁,因而在写线程操作的时候,其他的读线程都必须等待。

**写时复制(copy on write)**是指多线程对保护对象进行读写操作时,执行写操作的线程在写时,会把该对象复制一份(并对复制后的对象实例进行写修改操作),最终就可以做到写操作进行的同时,不阻塞其他线程的读操作。

当在把对象复制一份完成之后,写操作完成之前,读操作来了,这时候需要先读复制后的对象(因为它是最新的),再读复制前的对象。

写时复制适合读多写少的应用场景,比如白名单,黑名单,商品类目的访问和更新场景,而不适合内存敏感以及对实时性要求很高的场景。

优点:

  • 读操作性能很高,因为无需任何同步措施,比较适用于读多写少的并发场景。

缺点:

  • 缺点也很明显
    • 一是内存占用问题,毕竟每次执行写操作都要将原对象拷贝一份,数据量大时,对内存压力较大,可能会引起频繁GC;
    • 二是无法保证数据不一致,使用读写锁时可以保证读和写的强一致性。而CopyOnWrite由于其实现策略的原因,写和读分别作用在新老不同对象上。因而,在写操作执行过程中,读虽然不会被阻塞,但读取到的却是旧对象(或者说更新前的对象)。

Reference