/* * Copyright 2014-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.internal; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; import com.amazonaws.annotation.ThreadSafe; /** * A bounded cache that has a FIFO eviction policy when the cache is full. * * @param <T> * value type */ @ThreadSafe public final class FIFOCache<T> { private final BoundedLinkedHashMap<String, T> map; private final ReadLock rlock; private final WriteLock wlock; /** * @param maxSize * the maximum number of entries of the cache */ public FIFOCache(final int maxSize) { if (maxSize < 1) { throw new IllegalArgumentException("maxSize " + maxSize + " must be at least 1"); } map = new BoundedLinkedHashMap<String, T>(maxSize); ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); rlock = lock.readLock(); wlock = lock.writeLock(); } /** * Adds an entry to the cache, evicting the earliest entry if necessary. */ public T add(String key, T value) { wlock.lock(); try { return map.put(key, value); } finally { wlock.unlock(); } } /** Returns the value of the given key; or null of no such entry exists. */ public T get(String key) { rlock.lock(); try { return map.get(key); } finally { rlock.unlock(); } } /** * Returns the current size of the cache. */ public int size() { rlock.lock(); try { return map.size(); } finally { rlock.unlock(); } } /** * Returns the maximum size of the cache. */ public int getMaxSize() { return map.getMaxSize(); } @Override public String toString() { rlock.lock(); try { return map.toString(); } finally { rlock.unlock(); } } }