Created
March 24, 2018 09:07
-
-
Save evil0th/226c6cc4c3f31c8291c30c88faff9eba to your computer and use it in GitHub Desktop.
利用LinkedHashMap实现简单的缓存
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.github.liaow.component; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.LinkedHashMap; | |
import java.util.Map; | |
import java.util.concurrent.locks.Lock; | |
import java.util.concurrent.locks.ReentrantLock; | |
/** | |
* 利用LinkedHashMap实现简单的缓存, 必须实现removeEldestEntry方法,具体参见JDK文档 | |
* | |
* @param <K> | |
* @param <V> | |
* @author liao | |
*/ | |
public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> { | |
private final int maxCapacity; | |
private static final float DEFAULT_LOAD_FACTOR = 0.75f; | |
private final Lock lock = new ReentrantLock(); | |
public LRULinkedHashMap(int maxCapacity) { | |
super(maxCapacity, DEFAULT_LOAD_FACTOR, true); | |
this.maxCapacity = maxCapacity; | |
} | |
@Override | |
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) { | |
return size() > maxCapacity; | |
} | |
@Override | |
public boolean containsKey(Object key) { | |
try { | |
lock.lock(); | |
return super.containsKey(key); | |
} finally { | |
lock.unlock(); | |
} | |
} | |
@Override | |
public V get(Object key) { | |
try { | |
lock.lock(); | |
return super.get(key); | |
} finally { | |
lock.unlock(); | |
} | |
} | |
@Override | |
public V put(K key, V value) { | |
try { | |
lock.lock(); | |
return super.put(key, value); | |
} finally { | |
lock.unlock(); | |
} | |
} | |
@Override | |
public int size() { | |
try { | |
lock.lock(); | |
return super.size(); | |
} finally { | |
lock.unlock(); | |
} | |
} | |
@Override | |
public void clear() { | |
try { | |
lock.lock(); | |
super.clear(); | |
} finally { | |
lock.unlock(); | |
} | |
} | |
public Collection<Map.Entry<K, V>> getAll() { | |
try { | |
lock.lock(); | |
return new ArrayList<Map.Entry<K, V>>(super.entrySet()); | |
} finally { | |
lock.unlock(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment