一、什么是copyOnWrite容器
1)含义:写时拷贝复制。
2)在并发访问的背景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改。修改完成之后,将指向原来容器的引用指向新的容器(副本容器)。
二、优点
1)支持并发的读,而不需要加锁;
2)读写分离,读和写不同的容器。
二、JDK支持
1)CopyOnWriteArraylList
<code>public
booleanadd
(E e
) { final ReentrantLocklock
=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(); } }/<code>
2)CopyOnWriteArraySet(省略)
四、使用场景:CopyOnWrite并发容器用于读多写少的并发场景
五、缺点
1)占用内存大:拷贝容器数组导致
2)数据一致性问题:
CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器
六、一个小例子
<code>public
class
CopyOnWriteListTest
{public
static
void
main
(String[] args
) throws InterruptedException { final List copyOnWriteArrayList =new
CopyOnWriteArrayList(); 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(); Thread.sleep(2000
); System.out
.println(copyOnWriteArrayList.get
(1
)); } }/<code>
關鍵字: lock newElements add