轻量级写时复制实现
Java 语言本身提供了两个 COW 数据结构 CopyOnWriteArrayList 和 CopyOnWriteArraySet,但在某些场景下,比如配置信息热更新、缓存系统数据刷新和一些读多写少且需要保证数据一致性的场景,它们太重了。以 CopyOnWriteArrayList 的 add 方法为例,它在实现时使用了 synchronized 同步代码块。在这些场景下,我们可以使用一种轻量级的实现方式,即原子性地替换引用并利用 volatile 保证其他线程的可见性。
1 | public class FooService { |
这种实现方式可以称为无锁读写模式、乐观读取模式、Safe Publication via Immutable Snapshots 或者 Copy-on-Write Reference。下面是运行时引用变化示意图
下面是由 next-ai-draw-io 画的示意图,只做了一点儿微调