黑马程序员技术交流社区

标题: 关于缓存设计思路的一些疑问 [打印本页]

作者: 冉世友    时间: 2013-1-7 11:28
标题: 关于缓存设计思路的一些疑问
我把value值放到getData方法外面了,这样多个线程才能共享value吧?
还有我在第一个if(value == null)后面加了个大括号,这样其它线程第一个判断不满足,就不用接着判断第二个if(value == null) 了?
大家看看我这样做有没有问题?
  1. package cn.itcast;

  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.concurrent.locks.ReadWriteLock;
  5. import java.util.concurrent.locks.ReentrantReadWriteLock;

  6. /*
  7. * 读写锁的应用:设计一个缓存系统
  8. * 多个线程读不互斥,但是读写互斥,写写互斥
  9. */
  10. public class CacheDemo {
  11.        
  12.         private Map<String, Object> cacheData = new HashMap<String, Object>();
  13.         public static void main(String[] args) {
  14.                
  15.         }
  16.        
  17.         private Object value = null;
  18.         private ReadWriteLock rwl = new ReentrantReadWriteLock();
  19.         public Object getData(String key){
  20.                 rwl.readLock().lock();
  21.                 try {
  22.                         value = cacheData.get(key);
  23.                         if(value == null){
  24.                                 rwl.readLock().unlock();
  25.                                 rwl.writeLock().lock();
  26.                                 try{
  27.                                         if(value==null)    //重复检查value状态,因为可能多个线程会访问到此处。
  28.                                                 value = "aaa";  //实际去queryDB
  29.                                 } finally {
  30.                                         rwl.readLock().lock();
  31.                                         rwl.writeLock().unlock(); //在释放写锁之前上读锁
  32.                                 }
  33.                         }
  34.                                
  35.                 } finally {
  36.                        
  37.                         rwl.readLock().unlock();
  38.                 }
  39.                
  40.                 return value;
  41.         }

  42. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2