|
@@ -6,7 +6,7 @@ import java.io.Serializable;
|
|
|
import java.util.Iterator;
|
|
import java.util.Iterator;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.WeakHashMap;
|
|
import java.util.WeakHashMap;
|
|
|
-import java.util.concurrent.locks.StampedLock;
|
|
|
|
|
|
|
+import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 简单缓存,无超时实现,默认使用{@link WeakHashMap}实现缓存自动清理
|
|
* 简单缓存,无超时实现,默认使用{@link WeakHashMap}实现缓存自动清理
|
|
@@ -23,7 +23,7 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
*/
|
|
*/
|
|
|
private final Map<K, V> cache;
|
|
private final Map<K, V> cache;
|
|
|
// 乐观读写锁
|
|
// 乐观读写锁
|
|
|
- private final StampedLock lock = new StampedLock();
|
|
|
|
|
|
|
+ private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 构造,默认使用{@link WeakHashMap}实现缓存自动清理
|
|
* 构造,默认使用{@link WeakHashMap}实现缓存自动清理
|
|
@@ -53,11 +53,11 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
* @return 值
|
|
* @return 值
|
|
|
*/
|
|
*/
|
|
|
public V get(K key) {
|
|
public V get(K key) {
|
|
|
- long stamp = lock.readLock();
|
|
|
|
|
|
|
+ lock.readLock().lock();
|
|
|
try {
|
|
try {
|
|
|
return cache.get(key);
|
|
return cache.get(key);
|
|
|
} finally {
|
|
} finally {
|
|
|
- lock.unlockRead(stamp);
|
|
|
|
|
|
|
+ lock.readLock().unlock();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -69,23 +69,11 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
* @return 值对象
|
|
* @return 值对象
|
|
|
*/
|
|
*/
|
|
|
public V get(K key, Func0<V> supplier) {
|
|
public V get(K key, Func0<V> supplier) {
|
|
|
- if (null == supplier) {
|
|
|
|
|
- return get(key);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ V v = get(key);
|
|
|
|
|
|
|
|
- long stamp = lock.readLock();
|
|
|
|
|
- V v;
|
|
|
|
|
- try {
|
|
|
|
|
- v = cache.get(key);
|
|
|
|
|
- if (null == v) {
|
|
|
|
|
- // 尝试转换独占写锁
|
|
|
|
|
- long writeStamp = lock.tryConvertToWriteLock(stamp);
|
|
|
|
|
- if (0 == writeStamp) {
|
|
|
|
|
- // 转换失败,手动更新为写锁
|
|
|
|
|
- lock.unlockRead(stamp);
|
|
|
|
|
- writeStamp = lock.writeLock();
|
|
|
|
|
- }
|
|
|
|
|
- stamp = writeStamp;
|
|
|
|
|
|
|
+ if(null == v && null != supplier){
|
|
|
|
|
+ lock.writeLock().lock();
|
|
|
|
|
+ try{
|
|
|
v = cache.get(key);
|
|
v = cache.get(key);
|
|
|
// 双重检查,防止在竞争锁的过程中已经有其它线程写入
|
|
// 双重检查,防止在竞争锁的过程中已经有其它线程写入
|
|
|
if (null == v) {
|
|
if (null == v) {
|
|
@@ -96,10 +84,11 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
}
|
|
}
|
|
|
cache.put(key, v);
|
|
cache.put(key, v);
|
|
|
}
|
|
}
|
|
|
|
|
+ } finally{
|
|
|
|
|
+ lock.writeLock().unlock();
|
|
|
}
|
|
}
|
|
|
- } finally {
|
|
|
|
|
- lock.unlock(stamp);
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
return v;
|
|
return v;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -112,11 +101,11 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
*/
|
|
*/
|
|
|
public V put(K key, V value) {
|
|
public V put(K key, V value) {
|
|
|
// 独占写锁
|
|
// 独占写锁
|
|
|
- final long stamp = lock.writeLock();
|
|
|
|
|
|
|
+ lock.writeLock().lock();
|
|
|
try {
|
|
try {
|
|
|
cache.put(key, value);
|
|
cache.put(key, value);
|
|
|
} finally {
|
|
} finally {
|
|
|
- lock.unlockWrite(stamp);
|
|
|
|
|
|
|
+ lock.writeLock().unlock();
|
|
|
}
|
|
}
|
|
|
return value;
|
|
return value;
|
|
|
}
|
|
}
|
|
@@ -129,11 +118,11 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
*/
|
|
*/
|
|
|
public V remove(K key) {
|
|
public V remove(K key) {
|
|
|
// 独占写锁
|
|
// 独占写锁
|
|
|
- final long stamp = lock.writeLock();
|
|
|
|
|
|
|
+ lock.writeLock().lock();
|
|
|
try {
|
|
try {
|
|
|
return cache.remove(key);
|
|
return cache.remove(key);
|
|
|
} finally {
|
|
} finally {
|
|
|
- lock.unlockWrite(stamp);
|
|
|
|
|
|
|
+ lock.writeLock().unlock();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -142,11 +131,11 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
*/
|
|
*/
|
|
|
public void clear() {
|
|
public void clear() {
|
|
|
// 独占写锁
|
|
// 独占写锁
|
|
|
- final long stamp = lock.writeLock();
|
|
|
|
|
|
|
+ lock.writeLock().lock();
|
|
|
try {
|
|
try {
|
|
|
this.cache.clear();
|
|
this.cache.clear();
|
|
|
} finally {
|
|
} finally {
|
|
|
- lock.unlockWrite(stamp);
|
|
|
|
|
|
|
+ lock.writeLock().unlock();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -154,4 +143,4 @@ public class SimpleCache<K, V> implements Iterable<Map.Entry<K, V>>, Serializabl
|
|
|
public Iterator<Map.Entry<K, V>> iterator() {
|
|
public Iterator<Map.Entry<K, V>> iterator() {
|
|
|
return this.cache.entrySet().iterator();
|
|
return this.cache.entrySet().iterator();
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+}
|