zoukankan      html  css  js  c++  java
  • java 多线程 day12 读写锁


    import java.util.Random;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    /**
    * Created by chengtao on 17/12/5.
    * Lock 是替代 sycronized 的,而且sycronized无法实现读写锁
    */


    public class Thread1201_ReadWriteLock {
    public static void main(String[] args) {
    final Queue3 q3 = new Queue3();
    for(int i=0;i<30;i++)
    {
    new Thread(){
    public void run(){
    while(true){
    q3.get();
    }
    }

    }.start();

    new Thread(){
    public void run(){
    while(true){
    q3.put(new Random().nextInt(10000));
    }
    }

    }.start();
    }

    }
    }

    class Queue3{
    private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
    ReadWriteLock rwl = new ReentrantReadWriteLock();
    public void get(){
    rwl.readLock().lock();
    try {
    System.out.println(Thread.currentThread().getName() + " 准备去读 ----- 数据!");
    Thread.sleep((long)(Math.random()*10));
    System.out.println(Thread.currentThread().getName() + " 已经读到 ----- 数据 :" + data);
    System.out.println();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }finally{
    rwl.readLock().unlock();
    }
    }

    public void put(Object data){

    rwl.writeLock().lock();
    try {
    System.out.println(Thread.currentThread().getName() + " 准备去写数据 !");
    Thread.sleep((long)(Math.random()*1000));
    this.data = data;
    System.out.println(Thread.currentThread().getName() + " 已经写入数据 : " + data);
    System.out.println();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }finally{
    rwl.writeLock().unlock();
    }


    }
    }
    ------------------------
    ------------------------
    ------------------------

    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;

    /**
    * Created by chengtao on 17/12/5.
    */
    public class Thread1202_ReadWriteLock_Cache {
    private Map<String, Object> cache = new HashMap<String, Object>();
    public static void main(String[] args) {

    }

    //读写锁在缓存中的应用
    private ReadWriteLock rwl = new ReentrantReadWriteLock();
    public Object getData(String key){
    rwl.readLock().lock();
    Object value = null;
    try{
    value = cache.get(key);
    if(value == null){
    rwl.readLock().unlock();
    rwl.writeLock().lock();
    try{
    if(value==null){
    value = "aaaa";//实际失去queryDB();
    }
    }finally{
    rwl.writeLock().unlock();
    }
    rwl.readLock().lock();
    }
    }finally{
    rwl.readLock().unlock();
    }
    return value;
    }
    }
     
  • 相关阅读:
    STL与基础数据结构
    solr基础总结
    linux命令笔记
    SolrCloud集群部署
    oracle SQL笔记
    内存溢出之Tomcat内存配置
    solr查询优化(实践了一下效果比较明显)
    JAVA处理线程超时
    Solr 数据导入 <一>DIH简单使用
    几种防止表单重复提交的方法
  • 原文地址:https://www.cnblogs.com/ctaixw/p/7979849.html
Copyright © 2011-2022 走看看