线程中的读写锁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 }
作者:SummerChill 出处:http://www.cnblogs.com/DreamDrive/ 本博客为自己总结亦或在网上发现的技术博文的转载。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |