K
- キーの型V
- 値の型public class CopyOnReadMap<K,V> extends MapWrapper<K,V>
リクエストスレッドがセッション上の変数にアクセスした時点で、 セッションのスナップショット(ディープコピー)をスレッドローカル変数上に作成する。 以降、当該リクエストスレッドからのアクセスはこのスナップショットに対して行われる。 リクエスト終了時にスナップショット上の変更をもとのセッションにマージするが、 この際、他のリクエストスレッドによってセッションが既に書き換えられていた場合はConcurrentModificationException
を送出する。 また、セッションの直列化に失敗した場合はCopyOnReadMap.SnapshotCreationError
を送出する。
Modifier and Type | Class and Description |
---|---|
static class |
CopyOnReadMap.SnapshotCreationError
マップ内にserialize不可能なオブジェクトが存在するなどの理由により、
スナップショットの作成に失敗したことを表す実行じ例外。
|
Constructor and Description |
---|
CopyOnReadMap()
デフォルトコンストラクタ
|
CopyOnReadMap(java.util.Map<K,V> baseMap)
指定されたMapオブジェクトに対する並行アクセスラッパーを作成する。
|
Modifier and Type | Method and Description |
---|---|
CopyOnReadMap<K,V> |
deactivate()
同期処理を停止する。
以降はベースとなるMapに単に処理を委譲するのみ。
|
java.util.Map<K,V> |
getDelegateMap()
このラッパーが処理を委譲する
Map オブジェクトを返す。 |
void |
refresh()
現在のスナップショットを破棄する。
|
CopyOnReadMap<K,V> |
save()
カレントスレッドが保持しているスナップショットを実体のマップに反映する。
処理の結果によらず、現行スレッドのスナップショットは破棄する。
|
CopyOnReadMap<K,V> |
setIgnoredEntries(K... entryNames)
同期処理の対象外とするエントリを追加する。
|
clear, containsKey, containsValue, entrySet, equals, get, getDelegateMapOfType, hashCode, isEmpty, keySet, put, putAll, remove, size, toString, values
public CopyOnReadMap()
このコンストラクタの処理は以下のソースコードと等価である。 new ConcurrentReadMap(new ConcurrentHashMap);
public java.util.Map<K,V> getDelegateMap() throws CopyOnReadMap.SnapshotCreationError
Map
オブジェクトを返す。
本クラスの実装では、変更点を一時的に保持するためのスナップショットが返される。
スナップショットに対する変更はsave()
で明示的に反映させる必要がある。getDelegateMap
in class MapWrapper<K,V>
CopyOnReadMap.SnapshotCreationError
- セッション内にserialize不可能なオブジェクトが存在するなどの理由で、
セッションのスナップショットの作成に失敗した場合。public CopyOnReadMap<K,V> deactivate()
public CopyOnReadMap<K,V> setIgnoredEntries(K... entryNames)
entryNames
- 同期処理の対象外とするエントリのキー名public CopyOnReadMap<K,V> save() throws java.util.ConcurrentModificationException, CopyOnReadMap.SnapshotCreationError
java.util.ConcurrentModificationException
- スナップショットを作成してからこれまでの間に、
カレントスレッド以外によるアクセスがあった場合。CopyOnReadMap.SnapshotCreationError
- セッション内にserialize不可能なオブジェクトが存在するなどの理由で、
セッションのスナップショットの作成に失敗した場合。public void refresh()