zoukankan      html  css  js  c++  java
  • 线程中的读写锁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 }
  • 相关阅读:
    复制文件-用FileOutputStream和FileInputStream读写文件
    向属性文件中添加属性
    合并多个文件的内容
    EVA4400存储RAID信息丢失数据恢复过程
    DELL Eq PS4000数据恢复成功案例
    华为OceanStor S5600T服务器数据恢复
    IBM ds4700崩溃重组raid及修复数据库
    分析IBM AIX存储层结构 / 常用存储命令整理
    riad5阵列崩溃,恢复数据过程
    如何使用Handy Backup 6.2进行数据备份(步骤阅读)
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6205327.html
Copyright © 2011-2022 走看看