我把value值放到getData方法外面了,这样多个线程才能共享value吧?
还有我在第一个if(value == null)后面加了个大括号,这样其它线程第一个判断不满足,就不用接着判断第二个if(value == null) 了?
大家看看我这样做有没有问题?- package cn.itcast;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- /*
- * 读写锁的应用:设计一个缓存系统
- * 多个线程读不互斥,但是读写互斥,写写互斥
- */
- public class CacheDemo {
-
- private Map<String, Object> cacheData = new HashMap<String, Object>();
- public static void main(String[] args) {
-
- }
-
- private Object value = null;
- private ReadWriteLock rwl = new ReentrantReadWriteLock();
- public Object getData(String key){
- rwl.readLock().lock();
- try {
- value = cacheData.get(key);
- if(value == null){
- rwl.readLock().unlock();
- rwl.writeLock().lock();
- try{
- if(value==null) //重复检查value状态,因为可能多个线程会访问到此处。
- value = "aaa"; //实际去queryDB
- } finally {
- rwl.readLock().lock();
- rwl.writeLock().unlock(); //在释放写锁之前上读锁
- }
- }
-
- } finally {
-
- rwl.readLock().unlock();
- }
-
- return value;
- }
- }
复制代码 |