Реализация сравнения и замены (CAS) в EhCache

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


person Adam    schedule 17.02.2011    source источник


Ответы (1)


Эквивалентным методом сравнения и замены в EhCache является метод replace(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 package), вы обнаружите, что замена на самом деле осуществляется путем получения блокировки записи. Тем не менее, можно предположить, что получение блокировки записи ничем не отличается от использования метода replace. Таким образом, вы теоретически можете заменить всю эту функцию, вызвав aCache.aquireWriteLockOnKey, выполнив необходимые действия, а затем сняв блокировку записи.

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

person Adam    schedule 22.02.2011