缓存的作用不言而喻,缓存可以极大提高对数据的访问效率,因为避免了每次请求都对数据库进行操作。今天刚学完线程的读写锁,发现使用锁能够使得缓存的数据更安全,于是便自己手动实现了一下。缓存的基本原理是当用户取数据时,先判断缓存里面是否有需要的值,有则直接返回,节省了对数据库的操作。下面是自己的一个小Demo。
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CacheDemo {
Map<String, Object> cache = new HashMap<String ,Object>();
ReadWriteLock rwl = new ReentrantReadWriteLock();
public Object getData(String key){
rwl.readLock().lock();
Object value = null;
try{
value = cache.get(key);
if(value == null){
rwl.readLock().unlock();//使用写锁之前一定得释放读锁
rwl.writeLock().lock();//因为要对数据进行操作了,所以得用写锁
try{
if(value == null){
//获取数据value = "data";
cache.put(key, value);
}
}finally {
rwl.writeLock().unlock();//释放写锁
}
rwl.readLock().lock();
//使用数据
}
}finally {
rwl.readLock().unlock();
}
return value;
}
}
这段代码有一个很好的地方是第二次判断value是否为null,因为考虑到这么一个情况,当三个线程都同时到达写锁时,第一个线程访问并得到数据后,后面进来的两个线程 就不需要再去请求数据了,因为map中已经有后面两个线程想要的值了(第一个线程已经取到数据)。最后补充一点知识:当上读锁时,是不允许进行写的,但可以并发读。 上写锁时, 不允许读,只能由当前线程进行操作直至它完成操作。