標籤:緩衝和讀寫鎖之間的關係
先說最常見的一道面試題:
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;
}
}
以上主要聽張孝祥老師講課整理
向張老師致敬!願他在那邊不要那麼辛苦!
Java緩衝和讀寫鎖