Ejemplo n.º 1
0
  /*
   * Remove operation with a flag so we can tell coherence if the remove was
   * caused by cache internal processing such as eviction or loading
   */
  public synchronized V remove(Object key, boolean internal) {
    //noinspection SuspiciousMethodCalls
    CacheObject<V> cacheObject = map.remove(key);
    // If the object is not in cache, stop trying to remove it.
    if (cacheObject == null) {
      return null;
    }
    // Remove from the cache order list
    cacheObject.lastAccessedListNode.remove();
    cacheObject.ageListNode.remove();
    // Remove references to linked list nodes
    cacheObject.ageListNode = null;
    cacheObject.lastAccessedListNode = null;

    return cacheObject.object;
  }
Ejemplo n.º 2
0
  public synchronized V put(K key, V value) {
    V oldValue = null;
    // Delete an old entry if it exists.
    if (map.containsKey(key)) {
      oldValue = remove(key, true);
    }

    CacheObject<V> cacheObject = new CacheObject<V>(value);
    map.put(key, cacheObject);
    // Make an entry into the cache order list.
    // Store the cache order list entry so that we can get back to it
    // during later lookups.
    cacheObject.lastAccessedListNode = lastAccessedList.addFirst(key);
    // Add the object to the age list
    LinkedListNode ageNode = ageList.addFirst(key);
    ageNode.timestamp = System.currentTimeMillis();
    cacheObject.ageListNode = ageNode;

    // If cache is too full, remove least used cache entries until it is not too full.
    cullCache();

    return oldValue;
  }