ChronicleMap (2.1.7) を調べると、 acquireUsingLocked(); を呼び出すときの WriteContext の適切な使用法について正確にはわかりません。
私が興味を持っているシナリオは、関数呼び出し元の観点からアトミックに 2 つのアクションを実行する必要がある関数です。それらの 1 つは、存在しない場合、マップにエントリを追加することです。もう 1 つは、マップ内の指定されたキーの値が以前になかった場合にのみ実行されます。
マップ内の特定のキーに対する値が以前になく、この 2 番目のアクションが失敗した場合、後続のテストで対応するキーの値が見つからないように、マップを更新しないでください。
指定されたキーのマップに既にエントリがあった場合、元の値を更新したくなく、この 2 番目のアクションを実行したくありません。ただし、呼び出し元の戻り値を作成するには、元のエントリの値を使用する必要があります。
WriteContext.created() のドキュメントには、エントリが以前に存在した場合にのみ true を返すと記載されています。エントリが以前に存在していた場合、コンテキストから以前の値への参照を取得することは可能ですか (または、WriteContext スコープ内で map.get() を呼び出すなどの他の方法)?
WriteContext.value() は何を参照していますか? 前のエントリの値か、acquireUsingLocked() への呼び出しで提供した潜在的に更新された値?
また、以前にマップにエントリがなく、マップを更新したくない場合は、WriteContext.removeEntry() または WriteContext.dontPutOnClose() を呼び出す必要がありますか?
必要だと考えているロジックの例を次に示します。
EntryData newValue = new EntryData();
EntryData originalValue = null;
try (WriteContext<String, EntryData> context = _map.acquireUsingLocked(key, newValue) ) {
if ( !context.created() ) {
if ( doSomething() ) {
result = createResult(newValue);
}
else {
context.removeEntry();
result = null;
}
}
else {
context.dontPutOnClose();
originalValue = context.value();
result = createResult(originalValue);
}
}