对读写锁的深入理解-读写锁技术的妙用---实现缓存

对读写锁的深入理解


 参考:http://www.educity.cn/wenda/380140.html  其中有些小理解错误,大体可以接受

        参考:http://www.wang1314.com/doc/topic-898895-1.html  主要通过其理解降级锁


1、对降级锁的理解

2、读写锁技术的妙用----读写锁实现缓存


1锁降级

       锁降级是指写锁降级为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不叫锁降级。锁降级是指把持住(当前拥有)写锁,再获取到读锁,然后释放(先前拥有的)写锁的过程。锁降级中读锁的获取是否有必要呢?答案是必要的。主要是为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁,假设此刻另一个线程T获取了写锁了并修改了数据,那么当前线程无法感知到线程T的数据更新。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进行数据更新。

ReentrantReadWriteLock不支持锁升级(把持读锁,获取写锁,最后释放读锁的过程)。目的也是保证数据可见性。如果读锁已经被多个线程获取,其中任意线程成功获取了写锁并更新了数据,则其更新数其他获取到读锁的线程是不可见的。

 


理解:在jdk api中对ReentrantReadWriteLock可重入读写锁的加锁顺序的必要性

 class CachedData {
   Object data;
   volatile boolean cacheValid;
   ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();

   void processCachedData() {
     rwl.readLock().lock();
     if (!cacheValid) {
        // Must release read lock before acquiring write lock
        rwl.readLock().unlock();
        rwl.writeLock().lock();
        // Recheck state because another thread might have acquired
        //   write lock and changed state before we did.
        if (!cacheValid) {
          data = ...
          cacheValid = true;
        }
        // Downgrade by acquiring read lock before releasing write lock
        rwl.readLock().lock();
        rwl.writeLock().unlock(); // Unlock write, still hold read
     }

     use(data);
     rwl.readLock().unlock();
   }
 }


2、读写锁技术的妙用---读写锁实现缓存

      代码处没有使用降级锁的顺序,多加了一个if判断,避免了其出错

public class CacheDemo {
	private Map<String, Object> cache = new HashMap<String, Object>();
	
	public static void main(String[] args) {
	}
	 
	private ReadWriteLock lock = new ReentrantReadWriteLock();
	 
	 public Object cache(Object value){
		 Object retVal = cache.get(value);
		 lock.readLock().lock();
		 try{
			 if(retVal==null){
				  lock.readLock().unlock();
				  lock.writeLock().lock();
				  try{
					  if(retVal==null){     //此处锁的顺序没有符合降级锁的顺序,但是多加了一个if判断,不会有其影响
						  retVal ="aaa";  //实际上去查询数据库
					  }
				  }
				  finally{
					  lock.writeLock().unlock();
				  }
				  lock.readLock().lock();
			 }
		 }
		 finally{
			 lock.readLock().unlock();
		 }
		 return retVal;
	 }
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值