Class CopyOnReadMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
nablarch.core.util.map.MapWrapper<K,V>
nablarch.core.util.map.CopyOnReadMap<K,V>
Type Parameters:
K - キーの型
V - 値の型
All Implemented Interfaces:
Map<K,V>

public class CopyOnReadMap<K,V> extends MapWrapper<K,V>
スレッド毎のスナップショットを作成することで、並行アクセスに対する一貫読み取りおよび、 楽観ロック方式による書き込みを行うラッパークラス。
 リクエストスレッドがセッション上の変数にアクセスした時点で、
 セッションのスナップショット(ディープコピー)をスレッドローカル変数上に作成する。
 以降、当該リクエストスレッドからのアクセスはこのスナップショットに対して行われる。
 リクエスト終了時にスナップショット上の変更をもとのセッションにマージするが、
 この際、他のリクエストスレッドによってセッションが既に書き換えられていた場合は
 ConcurrentModificationException を送出する。
 また、セッションの直列化に失敗した場合は CopyOnReadMap.SnapshotCreationError
 を送出する。
 
Author:
Iwauo Tajima
  • Constructor Details

    • CopyOnReadMap

      public CopyOnReadMap()
      デフォルトコンストラクタ
       このコンストラクタの処理は以下のソースコードと等価である。
           new ConcurrentReadMap(new ConcurrentHashMap<K, V>);
       
    • CopyOnReadMap

      public CopyOnReadMap(Map<K,V> baseMap)
      指定されたMapオブジェクトに対する並行アクセスラッパーを作成する。
      Parameters:
      baseMap - ラップ対象のMap
  • Method Details

    • getDelegateMap

      public Map<K,V> getDelegateMap() throws CopyOnReadMap.SnapshotCreationError
      このラッパーが処理を委譲するMapオブジェクトを返す。 本クラスの実装では、変更点を一時的に保持するためのスナップショットが返される。 スナップショットに対する変更はsave()で明示的に反映させる必要がある。
      Specified by:
      getDelegateMap in class MapWrapper<K,V>
      Returns:
      処理を委譲するMapオブジェクト
      Throws:
      CopyOnReadMap.SnapshotCreationError - セッション内にserialize不可能なオブジェクトが存在するなどの理由で、 セッションのスナップショットの作成に失敗した場合。
    • deactivate

      public CopyOnReadMap<K,V> deactivate()
      同期処理を停止する。 以降はベースとなるMapに単に処理を委譲するのみ。
      Returns:
      このオブジェクト自体。
    • setIgnoredEntries

      public CopyOnReadMap<K,V> setIgnoredEntries(K... entryNames)
      同期処理の対象外とするエントリを追加する。
      Parameters:
      entryNames - 同期処理の対象外とするエントリのキー名
      Returns:
      このオブジェクト自体
    • save

      カレントスレッドが保持しているスナップショットを実体のマップに反映する。 処理の結果によらず、現行スレッドのスナップショットは破棄する。
      Returns:
      このオブジェクト自体。
      Throws:
      ConcurrentModificationException - スナップショットを作成してからこれまでの間に、 カレントスレッド以外によるアクセスがあった場合。
      CopyOnReadMap.SnapshotCreationError - セッション内にserialize不可能なオブジェクトが存在するなどの理由で、 セッションのスナップショットの作成に失敗した場合。
    • refresh

      public void refresh()
      現在のスナップショットを破棄する。