com.ksyun.ks3.signer.internal.FIFOCache Maven / Gradle / Ivy
package com.ksyun.ks3.signer.internal;
import com.ksyun.ks3.annotation.ThreadSafe;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
/**
* A bounded cache that has a FIFO eviction policy when the cache is full.
*
* @param
* value type
*/
@ThreadSafe
public final class FIFOCache {
private final BoundedLinkedHashMap 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(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();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy