CopyOnWrite (写时复制)
前提是本来要变成俩份数据,做一次复制的。但是先不做,放到写操作的时候,再写成俩份。
Linux的CopyOnWrit 最初是linux的线程的fork()与exec()函数。为了少一次复制快速创建子线程。
Redis的CopyOnWrite 在RDB的时候,主线程不去copy而是正常的读写等真正的有额写入操作RDB才去写入被修改的内存。
JAVA的CopyOnWrite 就是 CopyOnWriteArrayList,CopyOnWriteArrayList是ArrayList的线程安全版本,从他的名字可以推测,CopyOnWriteArrayList是在有写操作的时候会copy一份数据,然后写完再设置成新的数据。CopyOnWriteArrayList适用于读多写少的并发场景,CopyOnWriteArraySet是线程安全版本的Set实现,它的内部通过一个CopyOnWriteArrayList来代理读写等操作,使得CopyOnWriteArraySet表现出了和CopyOnWriteArrayList一致的并发行为。CopyOnWriteArrayList使用了ReentrantLock来支持并发操作 set、add方法,array就是实际存放数据的数组对象。ReentrantLock是一种支持重入的独占锁,任意时刻只允许一个线程获得锁,所以可以安全的并发去写数组。底部实现(这里是数组)
get方法不加锁直接返回。
volatile 修饰,保证一致性
写时复制,写完更新引用。