Package nablarch.core.util.map
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>
スレッド毎のスナップショットを作成することで、並行アクセスに対する一貫読み取りおよび、
楽観ロック方式による書き込みを行うラッパークラス。
リクエストスレッドがセッション上の変数にアクセスした時点で、 セッションのスナップショット(ディープコピー)をスレッドローカル変数上に作成する。 以降、当該リクエストスレッドからのアクセスはこのスナップショットに対して行われる。 リクエスト終了時にスナップショット上の変更をもとのセッションにマージするが、 この際、他のリクエストスレッドによってセッションが既に書き換えられていた場合はConcurrentModificationException
を送出する。 また、セッションの直列化に失敗した場合はCopyOnReadMap.SnapshotCreationError
を送出する。
- Author:
- Iwauo Tajima
-
Nested Class Summary
Modifier and TypeClassDescriptionstatic class
マップ内にserialize不可能なオブジェクトが存在するなどの理由により、 スナップショットの作成に失敗したことを表す実行じ例外。Nested classes/interfaces inherited from class java.util.AbstractMap
AbstractMap.SimpleEntry<K extends Object,
V extends Object>, AbstractMap.SimpleImmutableEntry<K extends Object, V extends Object> -
Constructor Summary
ConstructorDescriptionデフォルトコンストラクタCopyOnReadMap
(Map<K, V> baseMap) 指定されたMapオブジェクトに対する並行アクセスラッパーを作成する。 -
Method Summary
Modifier and TypeMethodDescription同期処理を停止する。 以降はベースとなるMapに単に処理を委譲するのみ。このラッパーが処理を委譲するMap
オブジェクトを返す。void
refresh()
現在のスナップショットを破棄する。save()
カレントスレッドが保持しているスナップショットを実体のマップに反映する。 処理の結果によらず、現行スレッドのスナップショットは破棄する。setIgnoredEntries
(K... entryNames) 同期処理の対象外とするエントリを追加する。Methods inherited from class nablarch.core.util.map.MapWrapper
clear, containsKey, containsValue, entrySet, equals, get, getDelegateMapOfType, hashCode, isEmpty, keySet, put, putAll, remove, size, toString, values
Methods inherited from class java.util.AbstractMap
clone
Methods inherited from class java.lang.Object
finalize, getClass, notify, notifyAll, wait, wait, wait
Methods inherited from interface java.util.Map
compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, replace, replaceAll
-
Constructor Details
-
CopyOnReadMap
public CopyOnReadMap()デフォルトコンストラクタこのコンストラクタの処理は以下のソースコードと等価である。 new ConcurrentReadMap(new ConcurrentHashMap<K, V>);
-
CopyOnReadMap
指定されたMapオブジェクトに対する並行アクセスラッパーを作成する。- Parameters:
baseMap
- ラップ対象のMap
-
-
Method Details
-
getDelegateMap
このラッパーが処理を委譲するMap
オブジェクトを返す。 本クラスの実装では、変更点を一時的に保持するためのスナップショットが返される。 スナップショットに対する変更はsave()
で明示的に反映させる必要がある。- Specified by:
getDelegateMap
in classMapWrapper<K,
V> - Returns:
- 処理を委譲するMapオブジェクト
- Throws:
CopyOnReadMap.SnapshotCreationError
- セッション内にserialize不可能なオブジェクトが存在するなどの理由で、 セッションのスナップショットの作成に失敗した場合。
-
deactivate
同期処理を停止する。 以降はベースとなるMapに単に処理を委譲するのみ。- Returns:
- このオブジェクト自体。
-
setIgnoredEntries
同期処理の対象外とするエントリを追加する。- Parameters:
entryNames
- 同期処理の対象外とするエントリのキー名- Returns:
- このオブジェクト自体
-
save
public CopyOnReadMap<K,V> save() throws ConcurrentModificationException, CopyOnReadMap.SnapshotCreationErrorカレントスレッドが保持しているスナップショットを実体のマップに反映する。 処理の結果によらず、現行スレッドのスナップショットは破棄する。- Returns:
- このオブジェクト自体。
- Throws:
ConcurrentModificationException
- スナップショットを作成してからこれまでの間に、 カレントスレッド以外によるアクセスがあった場合。CopyOnReadMap.SnapshotCreationError
- セッション内にserialize不可能なオブジェクトが存在するなどの理由で、 セッションのスナップショットの作成に失敗した場合。
-
refresh
public void refresh()現在のスナップショットを破棄する。
-