读多写少·读写互斥·本地缓存
ReadWriteLock
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Cache {
final static Map<String, Object> map = new HashMap<>();
final static ReadWriteLock rwLock = new ReentrantReadWriteLock();
final static Lock rLock = rwLock.readLock();
final static Lock wLock = rwLock.writeLock();
static Object getIfPresent(String key) {
rLock.lock();
try {
return map.get(key);
} finally {
rLock.unlock();
}
}
static void put(String key, Object value) {
wLock.lock();
try {
map.put(key, value);
} finally {
wLock.unlock();
}
}
//实现缓存的按需加载·懒加载
static Object get(String key) {
Object v = null;
rLock.lock();
try {
v = map.get(key);
} finally {
rLock.unlock();
}
if(null != v) {
return v;
}
wLock.lock();
try {
// 再次验证
// 其他线程可能已经查询过数据库,因为读线程不互斥
v = map.get(key);
if (v == null) {
v = new Random().nextInt();//查询数据库
map.put(key, v);
}
} finally {
wLock.lock();
}
return v;
}
}StampedLock
Last updated
Was this helpful?