为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率。
注意: 在同一线程中,持有读锁后,不能直接调用写锁的lock方法 ,否则会造成死锁。
package com.javase.thread;
import java.util.HashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @author Alex Zhuang
*
* 缓存是为了提高读取数据的效率,当客户端访问服务器时,首先检查一下缓存中是否有相同的请求信息,
* 如有,则直接从缓存中读取,否则从数据库中读取.
*/
public class CacheClassTest<T> {
private HashMap<String,T> cache = new HashMap<String,T>();
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public T get(String key){
lock.readLock().lock();
T value = null;
try{
value = (T)cache.get(key);
if(value==null){
lock.readLock().unlock();
lock.writeLock().lock();
try{
if(value==null){
value=(T)"value from DB";//query DB
cache.put(key, value);
}
}finally{
lock.writeLock().unlock();
}
lock.readLock().lock();
}
}finally{
lock.readLock().unlock();
}
return value;
}
}