Java中的copyOnWrite容器

一、什么是copyOnWrite容器

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

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

二、优点

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

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

二、JDK支持

1)CopyOnWriteArraylList

<code>  
    

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(); } }/<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>


分享到:


相關文章: