2015-09-21 11 views

答えて

0

CopyOnWriteArrayListと

CopyOnWriteArrayListとのインスタンスは、複数の同時読み取り可能リストの実装として動作し、そしてためには、書き込みと同時に発生すること読み出します。これを行う方法は、変更されるたびに新しいリストを作成することです。

  1. 読み取りはブロックされず、実質的に揮発性読み取りのコストのみを支払う。
  2. 書き込みは読み取りをブロックしません(またはその逆)。書き込みは1回だけ実行できます。
  3. ConcurrentHashMapとは異なり、リスト内の複数の要素を書き込みまたはアクセスする書き込み操作(addAll()retainAll()など)はアトミックになります。

書き込み操作中、アレイは他の書き込みに対して完全にロックする必要があります。 (標準実装ではReentrantLockが使用されています)。これは、前述のように、複数の場所に影響を与える操作がアトミックである可能性があることを意味します。つまり、別のスレッドがsize()を呼び出している間に、あるスレッドがaddAll()で複数の項目をリストに追加すると、サイズを読み取るスレッドは、addAll()に追加された要素の数を反映するかどうかの値を取得します。中間値がに返される可能性はありません(もちろん、これらはリストにアクセスする唯一の2つのスレッドです!)。

CopyOnWriteArrayListとはreads hugely outnumber writes例のために設計されています。

CopyOnWriteArraySet

別のクラス、CopyOnWriteArraySetCopyOnWriteArrayListの上に構築されます。そのリストのカウンターパートと同様、このセットは、セットに含まれる要素数が少なく、読み込み数が大幅に多い場合に設計されています。

参考:それがこれを行うJava copy-on-write collections

+0

この場合、ロック機構はどのように機能しますか?たとえば、スレッドがリストを反復して、リスト内の項目を読み取ると、リストオブジェクトのロックが取得され、ロックの取得中に、他のスレッドがそれをどのように読み取ることができますか?どのように読み取りはブロックされていませんか? – prvn

+0

読み取りのためにロックを取得しません。ロックは、アレイ上で何らかの更新が行われている場合にのみ使用されます。 – YoungHobbit

+0

[get()](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.get% 28int%29)メソッドは、[set()](http://grepcode.com/file/repository)としてロックを持たない。grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.set%28int%2Cjava.lang.Object%29)最初にロックを取得して処理します。 – YoungHobbit

1

方法は、リストのブランドの新しいコピーにそれが変更されるたびにすることです。

読み取りはブロックされず、効果的に揮発性読み取りのコストのみを支払う。 書き込みは読み取りをブロックしません(またはその逆)。書き込みは1回だけ行うことができます。

関連する問題