001package org.cache2k.impl;
002
003/*
004 * #%L
005 * cache2k core package
006 * %%
007 * Copyright (C) 2000 - 2015 headissue GmbH, Munich
008 * %%
009 * This program is free software: you can redistribute it and/or modify
010 * it under the terms of the GNU General Public License as
011 * published by the Free Software Foundation, either version 3 of the 
012 * License, or (at your option) any later version.
013 * 
014 * This program is distributed in the hope that it will be useful,
015 * but WITHOUT ANY WARRANTY; without even the implied warranty of
016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
017 * GNU General Public License for more details.
018 * 
019 * You should have received a copy of the GNU General Public 
020 * License along with this program.  If not, see
021 * <http://www.gnu.org/licenses/gpl-3.0.html>.
022 * #L%
023 */
024
025/**
026 * @author Jens Wilke; created: 2013-12-22
027 */
028public abstract class LockFreeCache<E extends Entry, K, T>
029  extends BaseCache<E, K, T> {
030
031  /**
032   * First lookup in the hash unsynchronized, if missed, do synchronize and
033   * try again.
034   */
035  @Override
036  protected final E lookupOrNewEntrySynchronized(K key) {
037    int hc = modifiedHash(key.hashCode());
038    E e = Hash.lookup(mainHash, key, hc);
039    if (e != null) {
040      recordHit(e);
041      return e;
042    }
043    synchronized (lock) {
044      e = lookupEntry(key, hc);
045      if (e == null) {
046        e = newEntry(key, hc);
047        return e;
048      }
049      return e;
050    }
051  }
052
053  @Override
054  protected final E lookupEntryUnsynchronized(K key, int hc) {
055    E e = Hash.lookup(mainHash, key, hc);
056    if (e != null) {
057      recordHit(e);
058      return e;
059    }
060    return null;
061  }
062
063}