我试图在EhCache中找到相当于MemCache的CASMutator.cas。本质上,我正在为MemCache交换EhCache并需要实现一个通过CAS设置值的接口。有没有人对此有任何见解?另外,鉴于我并不声称自己是这方面的专家,如果有人对CAS的实际运作方式有什么高级概述,那也是值得赞赏的。
答案 0 :(得分:3)
EhCache中等效的compare和swap方法是net.sf.ehcache.Cache中的replace(Element old,Element element)方法。此方法将“旧”元素与当前位于缓存中的元素进行比较,如果匹配,则将“缓存中的元素”替换为“元素”。下面的方法提供了一个简单的用法示例,假设“aCache”是该方法可以访问的某个Cache对象,并且“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 类的替换方法包),你会发现替换实际上是通过获取写锁来实现的。也就是说,可以假设获取写锁与使用替换方法没有什么不同。因此,理论上可以通过调用aCache.aquireWriteLockOnKey替换整个函数,执行所需的操作,然后释放写锁。
比较和交换的概述可以在维基百科上找到:http://en.wikipedia.org/wiki/Compare-and-swap。