Сравнение и замена (CAS) в EhCache - PullRequest
1 голос
/ 17 февраля 2011

Я пытаюсь найти эквивалент CASMutator.cas в MemCache в EhCache. По сути, я заменяю EhCache на MemCache и мне нужно реализовать интерфейс, который вызывает установку значения через CAS. У кого-нибудь есть понимание этого? Кроме того, учитывая, что я не претендую на то, чтобы быть экспертом в этом, если у кого-либо есть общий обзор того, как на самом деле работает CAS / что он делает, это также будет оценено.

1 Ответ

3 голосов
/ 22 февраля 2011

Эквивалентом метода сравнения и обмена в EhCache является метод замены (Element old, Element element), который находится в net.sf.ehcache.Cache. Этот метод сравнивает «старый» элемент с элементом, который в данный момент находится в кеше, и, если он совпадает, заменяет элемент в кеше на «элемент». Следующий метод предоставляет простой пример использования, в котором предполагается, что «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 (метод replace класса Segment в пакете net.sf.ehcache.store.compound ), вы обнаружите, что замена на самом деле реализована путем получения блокировки записи. Тем не менее, можно предположить, что получение блокировки записи ничем не отличается от использования метода замены. Таким образом, вы можете теоретически заменить всю эту функцию, вызвав aCache.aquireWriteLockOnKey, выполнив необходимые действия и затем сняв блокировку записи.

Обзор сравнения и обмена можно найти в Википедии по адресу: http://en.wikipedia.org/wiki/Compare-and-swap.

...