在EhCache中比较和交换(CAS)实现

时间:2011-02-17 17:20:10

标签: memcached ehcache compare-and-swap

我试图在EhCache中找到相当于MemCache的CASMutator.cas。本质上,我正在为MemCache交换EhCache并需要实现一个通过CAS设置值的接口。有没有人对此有任何见解?另外,鉴于我并不声称自己是这方面的专家,如果有人对CAS的实际运作方式有什么高级概述,那也是值得赞赏的。

1 个答案:

答案 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