黑马程序员 java读写锁与缓存

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------


在java多线程中,为了提高效率有些共享资源允许同时进行多个读的操作,但只允许一个写的操作,比如一个文件,只要其内容不变可以让多个线程同时读,不必做排他的锁定,排他的锁定只有在写的时候需要,以保证别的线程不会看到数据不完整的文件

什么是读写锁(在读的方法上加读锁,在写的方法上加写锁):

分为读书与写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥


class Output2{
    private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();//创建读写锁,虚拟机会自动会为我们实习读锁与读锁不互斥,写锁与写锁互斥,读锁与写锁互斥
    private void read(){
       lock.readLock().lock();//读的方法加读锁
       try {
           Thread.sleep(200);
           System.out.println("be readly to read the data");
       } catch (InterruptedException e) {
           e.printStackTrace();
       }finally{
           lock.readLock().unlock();
       }
    }
   
    private void write(){
       lock.writeLock().lock();//写的方法加读锁
       try {
           Thread.sleep(200);
           System.out.println("be readly to write the data");
       } catch (InterruptedException e) {
           e.printStackTrace();
       }finally{
           lock.writeLock().unlock();
       }
    }
}

模拟缓存系统

//模拟缓存系统

class MyCache{
      private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
      private Map<String, Object> cache=new HashMap<String, Object>();
      public Object getDate(String key){
         lock.readLock().lock();//整的加读锁,提高系统性能
         Object ob=cache.get(key);
         try{
             if(ob==null){//如果发现数据不存在,则解除读锁,加写锁
                lock.readLock().unlock();
                lock.writeLock().lock();
                try{
                    if(ob==null){//防止多个读锁多次加载数据
                       ob="abc";//模拟数据库查询
                    }
               }catch (Exception e) {
                  // TODO: handle exception
              }finally{
                   lock.writeLock().unlock();//加载完数据后,则解除写锁,加读锁
              }
             }
             lock.readLock().lock();
            
         }catch (Exception e) {
            
         }finally{
             lock.readLock().unlock();
         } 
         return ob;
      }
     
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值