描述:Copy-On-Write指的是写时复制,这是一种技术,更是一种思想。可以帮助我们解决并发读写的问题
一、Java中CopyOnWrite
jdk中CopyOnWriteArrayList是写时复制容器,它的工作流程是:平时查询的时候,随便访问不需要加锁;只有在写入/删除的时候,才会从原来数据复制一个副本出来,然后对这个副本进行修改,最后用副本覆盖原来的数据
源码如下:
1 public boolean add(E var1) { 2 ReentrantLock var2 = this.lock; 3 var2.lock(); 4 5 boolean var6; 6 try { 7 Object[] var3 = this.getArray(); 8 int var4 = var3.length; 9 Object[] var5 = Arrays.copyOf(var3, var4 + 1); 10 var5[var4] = var1; 11 this.setArray(var5); 12 var6 = true; 13 } finally { 14 var2.unlock(); 15 } 16 17 return var6; 18 }
优点:适用于读多写少
缺点:
只能保证最终一致性,在复制但是没有替换的这段时间,读到的数据任然是旧的数据。
对象较大的时候,频繁复制替换会消耗大量内存,从内引发Java GC
二、主从复制
Redis和mysql的主从复制其实也包含了这个思想。