一、什么是copyOnWrite容器1)含义:写时拷贝复制,下面我们就来说一说关于java里面的io流?我们一起去了解并探讨一下这个问题吧!

java里面的io流(Java中的copyOnWrite容器)

java里面的io流

一、什么是copyOnWrite容器

1)含义:写时拷贝复制。

2)在并发访问的背景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修改完成之后,将指向原来容器的引用指向新的容器(副本容器)。

二、优点

1)支持并发的读,而不需要加锁;

2)读写分离,读和写不同的容器。

二、JDK支持

1)CopyOnWriteArraylList

/** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return {@code true} (as specified by {@link Collection#add}) */ public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { Object[] elements = getArray(); int len = elements.length; Object[] newElements = Arrays.copyOf(elements, len 1); newElements[len] = e; setArray(newElements); return true; } finally { lock.unlock(); } }

2)CopyOnWriteArraySet(省略)

四、使用场景:CopyOnWrite并发容器用于读多写少的并发场景

五、缺点

1)占用内存大:拷贝容器数组导致

2)数据一致性问题:

CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器

六、一个小例子

public class CopyOnWriteListTest { public static void main(String[] args) throws InterruptedException { final List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<String>(); copyOnWriteArrayList.add("1-old"); copyOnWriteArrayList.add("2-old"); /* * * 读数据线程 * */ new Thread() { @Override public void run() { copyOnWriteArrayList.get(1); } }.start(); /* * * 写数据线程 * */ new Thread(new Runnable() { @Override public void run() { copyOnWriteArrayList.set(1, "1-new"); } }).start(); /* * sleep 等待线程结束. * */ Thread.sleep(2000); System.out.println(copyOnWriteArrayList.get(1)); } }

,