EhCacheでMemCacheのCASMutator.casに相当するものを見つけようとしています。基本的に、EhCacheをMemCacheに交換しており、CASを介して値を設定するためのインターフェイスを実装する必要があります。誰かがこれについて何か洞察を持っていますか?また、私がこれらのいずれかの専門家であるとは主張していないことを考えると、CASが実際にどのように機能するか/それが何をしているのかについての高レベルの概要を誰かが持っているなら、それもありがたいです。
1 に答える
EhCacheで同等のcompareandswapメソッドは、net.sf.ehcache.Cacheにあるreplace(Element old、Element element)メソッドです。このメソッドは、「古い」要素を現在キャッシュにある要素と比較し、一致する場合は、キャッシュ内の要素を「要素」に置き換えます。次のメソッドは、「aCache」がメソッドがアクセスできるキャッシュオブジェクトであり、「aCache」がタイプLongのオブジェクトをキャッシュするために使用されることを前提とした簡単な使用例を示しています。
// Replace the cached value associated with key with newValue and
// return the original value
public Long replace(String key, Long newValue, long maxTries)
boolean success = false;
Long originalValue;
Element originalElement;
Element newElement = new Element(key, newValue);
for (int ii = 0; !success && ii < maxTries; ++ii) {
// Get a copy of the original List
originalValue = (Long) aCache.get(key).getValue();
// Make a duplicate of the Element that exists for "key"
originalElement = new Element(key, originalValue);
// if the value for inKey has not changed since setting originalValue,
// replace the value for "key" with "newValue"
if (aCache.replace(originalElement, newElement)) {
success = true;
}
}
if (!success) {
originalValue = null;
}
return originalValue;
}
これは、キーがすでにキャッシュに存在する場合にのみ機能することに注意してください。そうでない場合、aCache.replaceの呼び出しはfalseを返し、newElementをキャッシュに入れません。EhCacheの内部(net.sf.ehcache.store.compoundパッケージのSegmentクラスのreplaceメソッド)を十分に掘り下げると、書き込みロックを取得することで実際に置換が実装されていることがわかります。とはいえ、書き込みロックを取得することは、replaceメソッドを使用することと同じであると推測できます。そのため、理論的には、aCache.aquireWriteLockOnKeyを呼び出し、必要なアクションを実行してから書き込みロックを解放することで、この関数全体を置き換えることができます。
コンペアアンドスワップの概要は、ウィキペディアのhttp://en.wikipedia.org/wiki/Compare-and-swapにあります。