zoukankan      html  css  js  c++  java
  • 12.Java5读写锁技术的妙用

     1 import java.util.Random;
     2 import java.util.concurrent.locks.ReadWriteLock;
     3 import java.util.concurrent.locks.ReentrantReadWriteLock;
     4 /**
     5  * 
     6  * @author LiTaiQing
     7  *
     8  */
     9 public class ReadWriteLockTest {
    10     public static void main(String[] args){
    11         final Queue3 q3 = new Queue3();
    12         
    13         for (int i = 0; i < 3; i++) {
    14             new Thread(){
    15                 @Override
    16                 public void run(){
    17                     while(true){
    18                         q3.get();
    19                     }
    20                 }
    21             }.start();
    22             
    23             new Thread(){
    24                 @Override
    25                 public void run() {
    26                     q3.put(new Random().nextInt(10000));
    27                 };
    28             }.start();
    29             
    30         }
    31         
    32     }
    33     
    34 }
    35 class Queue3{
    36     private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
    37     //读写锁-实现类ReentrantReadWriteLock
    38     ReadWriteLock rwl = new ReentrantReadWriteLock();
    39     public void get(){
    40         rwl.readLock().lock();
    41         try {
    42             System.out.println(Thread.currentThread().getName() + " be ready to read data!");
    43             Thread.sleep((long)(Math.random()*1000));
    44             System.out.println(Thread.currentThread().getName() + "have read data :" + data);            
    45         } catch (InterruptedException e) {
    46             e.printStackTrace();
    47         }finally{
    48             rwl.readLock().unlock();
    49         }
    50     }
    51     public void put(Object data){
    52         rwl.writeLock().lock();
    53         try {
    54             System.out.println(Thread.currentThread().getName() + " be ready to write data!");                    
    55             Thread.sleep((long)(Math.random()*1000));
    56             this.data = data;        
    57             System.out.println(Thread.currentThread().getName() + " have write data: " + data);                    
    58         } catch (InterruptedException e) {
    59             e.printStackTrace();
    60         }finally{
    61             rwl.writeLock().unlock();
    62         }
    63     }
    64 }
     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  * 面试题,写一个缓存系统
     7  * @author LiTaiQing
     8  *
     9  */
    10 public class CacheDemo {
    11     
    12     private Map<String,Object> cache = new HashMap<String,Object>();
    13     
    14     public static void main(String[] args) {
    15         
    16     }
    17     /**
    18      *    读写锁的应用
    19      */
    20     private ReadWriteLock rwl = new ReentrantReadWriteLock();
    21     public Object getData(String key){
    22         rwl.readLock().lock();
    23         Object value = null;
    24         try{
    25             value =    cache.get(key);
    26             if(value == null){
    27                 rwl.readLock().unlock();
    28                 rwl.writeLock().lock();
    29                 try{
    30                     if(value == null){
    31                         value = "abc";//实际是去queryDB();
    32                     }
    33                 }finally{
    34                     rwl.writeLock().unlock();
    35                 }
    36                 rwl.readLock().lock();
    37             }
    38         }finally{
    39             rwl.readLock().unlock();
    40         }
    41         return value;
    42     }
    43     
    44 }
  • 相关阅读:
    [二叉树算法]关于层次遍历二叉树的一些算法总结
    数据库事务并发访问产生的问题及四种事务隔离级别
    当relative遇上z-index,阻断事件捕获
    关于CAS操作
    LRU算法与LRUCache
    Hadoop2.x 关于日志文件位置
    推荐系统架构图——我的软件工程概论课设
    文件上传+解析漏洞
    命令执行漏洞
    SSRF漏洞
  • 原文地址:https://www.cnblogs.com/litaiqing/p/4642548.html
Copyright © 2011-2022 走看看