线程中的读写锁ReadWriteLock

发布时间:2017-5-25 6:06:57 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"线程中的读写锁ReadWriteLock ",主要涉及到线程中的读写锁ReadWriteLock 方面的内容,对于线程中的读写锁ReadWriteLock 感兴趣的同学可以参考一下。

Lock锁还有两个非常强大的类

ReadWriteLock接口 实现类 ReentrantReadWriteLock    非常重要的锁

想实现 读取的时候允许多线程并发访问,写入的时候不允许. 这种效果....这种非常好....提高安全性.

  

ReadWriteLock 维护了一对相关的,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的.

互联网或者电商都会用到缓存的一种技术.从数据库中查出来的信息,信息保存到一个集合中,下一次再查找的时候就不用再从数据库中查找了.

读写锁 ReadWriteLock 可以解决 如果多线程并发访问共享数据时,只做了读取操作.

允许并发访问,如果有写入的操作,不允许.   提高效率.

一般写入操作只会在第一次访问的时候写入.以后之后进行读取操作.

Cache0.java

 1 import java.util.HashMap; 2 import java.util.Map; 3  4 public class Cache0 { 5      6     private static final Map<String,Object> CACHE = new HashMap<String,Object>(); 7      8     public synchronized Object getValue(String key){ 9         Object value = CACHE.get(key);10         if(value == null){11             value = "xxxx";//从数据库中查询出值,并赋值给value.12             CACHE.put(key, value);13         }14         return value;15     }16 }17 //如有有多条线程并发的访问这个方法,一开始value==null,多条线程都进入了if(value == null)然后给value赋值了很多次.18 //所以我们需要给getValue方法增加同步synchronized 关键字public synchronized Object getValue(String key){...19 //但是这样不太好,因为只有第一个线程进去的时候才需要同步,是set值,其他线程来不需要再同步,都是get值.

 Cache.java

 1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.concurrent.locks.ReadWriteLock; 4 import java.util.concurrent.locks.ReentrantReadWriteLock; 5 //缓存如果这么写,效率会有大大的提升. 6 public class Cache { 7      8     private static final Map<String, Object> CACHE = new HashMap<String, Object>(); 9     private static final ReadWriteLock RWL = new ReentrantReadWriteLock();10 11     public Object getValue(String key) {12         Object value = null;13         try {14             RWL.readLock().lock();// 读锁 锁上15 16             value = CACHE.get(key);17             if (value == null) {//第一次访问,缓存集合中没有值18                 try {19                     RWL.readLock().unlock();// 释放读锁20                     RWL.writeLock().lock();// 写锁锁上21                     if (value == null) {22                         value = "xxx";// 从数据库中查询出值,并赋值给value。23                         CACHE.put(key, value);24                     }25                 } finally {26                     RWL.writeLock().unlock();// 释放写锁27                     RWL.readLock().lock();// 读锁 锁上28                 }29             }30         } finally {31             RWL.readLock().unlock();32         }33         return value;34     }35 }

上一篇:性能测试入门分析
下一篇:【SQLServer】记一次数据迁移-标识重复的简单处理

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

腹肌贴健身器材智能腹部训练健腹器肌