spymemcached クライアントを使用してキャッシュ ロジックを実装しています。どういうわけか、キャッシュ内の一部のコンテンツを同時に変更するために CAS を使用する必要があります。
所有者がここからCASMutationの使用方法の非常に良い例をすでに示しているのを見ました: http://code.google.com/p/spymemcached/wiki/Examples#Using_CAS
しかし、コードのこの部分について 1 つの質問があります。
// Not strictly necessary if you specify the storage as
// LinkedList (our initial value isn't), but I like to keep
// things functional anyway, so I'm going to copy this list
// first.
LinkedList<Item> ll = new LinkedList<Item>(current);
コメントを注意深く読んでも、ここで何をしようとしているのか正確にはわかりません。「ll」にコピーせずに「current」だけを使用するとどうなるでしょうか。潜在的な問題は何ですか?
[アップデート]
サンプル コードに従って、次のようなメソッドを実装しています。うまくいきますか?
public <T> Set<T> addItemToSet(String key, int expire, final T newItem) throws Exception {
// This is how we modify a list when we find one in the cache.
CASMutation<Set<T>> mutation = new CASMutation<Set<T>>() {
// This is only invoked when a value actually exists.
public Set<T> getNewValue(Set<T> current) {
current.add( newItem );
return current;
}
};
HashSet<T> initialValue= new HashSet<T>();
initialValue.add( newItem );
CASMutator<Set<T>> mutator = new CASMutator<Set<T>>( memClient, getTranscoder() );
return mutator.cas(key, initialValue, expire, mutation);
}
スレッドセーフかどうかが一番心配です。