在操作系统和编程领域中充斥这大量的CoW。linux的进程fork,redis扩容时候的cow策略,以及java中的CopyOnWriteArrayList和CopyOnWriteArraySet等。
JAVA中的CoW
我们在面试会经常问List或者Set的线程安全的替代方案是什么?Vector但是Vector性能不高,性能高的替代方案是什么呢?就是CopyOnWriteArrayList和CopyOnWriteArraySet。
Cow容器的缺点:
- 因为在修改时候会复制整个容器,所以是以牺牲内存为代价的
- 因为复制容器所以在访问时候会有一定的时延。
Cow的原理和使用场景
在读取数据的时候共享,在修改的时候会开始复制,并且为了保证线程安全可能会在复制时候采取阻塞策略。使用场景读多写少。
额外的思考
redis的cow的扩容机制