标签:缓存和读写锁之间的关系
先说最常见的一道面试题:
hibernate 中的load()方法和get()方法的区别
用这些代码解释最好
User user = session.load(id,User.class);
User user = session.load(id,User.class);
//缓存代理
User$Proxy extends User{
private Integer id = id;
User realUser = null;
getName(){
if(realUser == null){
realUser = session.get(id);
if(realUser == null){
throw execption
}
return realUser.getName();
}
}
}
再看看API中附带的一段代码就可以明白什么事缓存了
class CachedDate{
Object date;
volatile boolean cacheValid;
ReentrantReadWriteLock rql = new ReentrantReadWriteLock();
void processCachedDate(){
rwl.readLock().lock();
if(!cacheValid){
rwl.readLock().unlock();
rwl.writeLock().lock();
if(!cacheValid){
data = ....
cacheValid = true;
}
rwl.readLock().lock();
rwl.readLock().unlock();
}
use(date);
rwl.readLock().unlock();
}
}
这段代码明白了不仅明白缓存还明白了什么是读写锁了一举两得
附带一个缓存的代码
public class CacheDemo {
private Map<String,Object> cache = new HashMap<>();
public static void main(String[] args) {
}
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
public synchronized Object getDatt(String key){
rwl.readLock().lock();
Object value = cache.get(key);
try{
if (value == null) {
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
if (value == null) {
value = "到数据库查询";
}
}finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
}finally{
rwl.readLock().unlock();
}
return value;
}
}
以上主要听张孝祥老师讲课整理
向张老师致敬!愿他在那边不要那么辛苦!
标签:缓存和读写锁之间的关系
原文地址:http://7981774.blog.51cto.com/7971774/1621635