A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冉世友 中级黑马   /  2013-1-7 11:28  /  1007 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

我把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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
金鑫 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马