缓存的作用不言而喻,缓存可以极大提高对数据的访问效率,因为避免了每次请求都对数据库进行操作。今天刚学完线程的读写锁,发现使用锁能够使得缓存的数据更安全,于是便自己手动实现了一下。缓存的基本原理是当用户取数据时,先判断缓存里面是否有需要的值,有则直接返回,节省了对数据库的操作。下面是自己的一个小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中已经有后面两个线程想要的值了(第一个线程已经取到数据)。最后补充一点知识:当上读锁时,是不允许进行写的,但可以并发读。 上写锁时, 不允许读,只能由当前线程进行操作直至它完成操作。