我正在使用 spymemcached 客户端来实现我的缓存逻辑。不知何故,我需要使用 CAS 来同时修改缓存中的某些内容。
我看到所有者已经展示了一个很好的例子来说明如何从这里使用 CASMutation:http ://code.google.com/p/spymemcached/wiki/Examples#Using_CAS
但是我对这部分代码有一个问题:
// 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);
即使我仔细阅读了评论,我仍然不明白它在这里试图做什么。如果我们只使用“current”而不复制到“ll”怎么办?有哪些潜在问题?
[更新]
我正在遵循示例代码并实现了这样的方法,这行得通吗?
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);
}
我最关心的是它是否是线程安全的。