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

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

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

 线程中的读写锁ReadWriteLock 

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 }

 

分类:

技术点:

相关文章: