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;    }}
 

转载于:https://www.cnblogs.com/ctaixw/p/7979849.html

java 多线程 day12 读写锁相关推荐

  1. java多线程 -- ReadWriteLock 读写锁

    写一条线程,读多条线程能够提升效率. 写写/读写 需要"互斥"; 读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 ...

  2. 对变量移位顺序读写_Java多线程并发读写锁ReadWriteLock实现原理剖析

    关于读写锁 Java语法层面的synchronized锁和JDK内置可重入锁ReentrantLock我们都经常会使用,这两种锁都属于纯粹的独占锁,也就是说这些锁任意时刻只能由一个线程持有,其它线程都 ...

  3. java 单例 读写锁_你用对锁了吗?浅谈 Java “锁” 事

    每个时代,都不会亏待会学习的人 大家好,我是yes. 本来打算继续写消息队列的东西的,但是最近在带新同事,发现新同事对于锁这方面有一些误解,所以今天就来谈谈"锁"事和 Java 中 ...

  4. java自己实现读写锁_关于读写锁算法的Java实现及思考

    问题背景:多个线程对一个共享的资源进行读写访问.写线程之间需要互斥,读线程跟写线程需要互斥,读线程之间不用互斥. 早些时候听张sir的课,讲述java5中增强并发的功能.用java.util.conc ...

  5. Java中的读/写锁

    原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写 ...

  6. java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的典型场景:多 ...

  7. java 实现队列读写锁_史上最全的Java并发系列之Java中的锁的使用和实现介绍(二)...

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在 絮叨 上节是锁的第一 ...

  8. java并发-ReentrantReadWriteLock读写锁

    一.概念 Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁 ...

  9. java线程系列---读写锁ReentrantReadWriteLock

    获取顺序 此类不会将读取者优先或写入者优先强加给锁定访问的排序.但是,它确实支持可选的公平 策略.当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入.当释放写入锁定后,将写入锁定分配给等待时 ...

最新文章

  1. 修改squid的Header中的X-Cache为Powered-By-LinuxTone
  2. 自动驾驶汽车的规划与控制
  3. java集合类——Stack栈类与Queue队列
  4. 大数据风控之贷前调查必知的十大客户信息
  5. win10自动切换日夜模式
  6. 【Flutter】Dart中的继承
  7. java 最长 几个字节,int类型占几个字节_在java中,int类型占四个字节,而byte类型占一个字节...
  8. AfterEffects 不支持 MKV 格式的解决办法
  9. ubuntu 16.04 插入耳机没有声音
  10. linux如何撤销权限修改,linux 撤销权限
  11. python verilog就业_[持续演进] 应届生 FPGA 就业,一点微小的看法
  12. Terminal Emulator for Android(安卓终端模拟器)的使用
  13. imToken的创始人何斌:让区块链泛式革命在社区蔓延开来
  14. 《Pro SQL Server Internals, 2nd edition》 作者:Dmitri KorotkevitchP55-58 P62-65 P68-69
  15. Node.js(三)路由器、中间件、MySQL模块、RESTful接口
  16. STM32开发 --- 1.8寸显示屏ST7735_输出英文、汉字、图片
  17. C# 获取MP3/WMA音频数据信息
  18. 2019年 团体程序设计天梯赛——题解集
  19. 使用python从概率角度绘制植物叶子!
  20. appium java 虫师_如何在Appium中使用AI定位

热门文章

  1. 天才少年何恺明:高考状元的开挂人生
  2. 字母s开头的c语言的工具,C语言库函数(S类字母) - 3
  3. oracle最新scn补丁,更新:Oracle全面修正了关于DB Link和SCN补丁的公告
  4. java字符串 大括号_string.format格式化字符串中转义大括号“{}”
  5. Python---将一字符串转换为字典,并按词语出现的频率由高到低进行排列。
  6. 001_推箱子-绘制图片
  7. mysql去掉两个最高分_如何计算去掉一个最高分和一个最低分后的平均分?
  8. mongo备份索引_【MongoDB学习之四】索引 聚合 备份与恢复 监控
  9. mysql的基本介绍简书_mysql 简介
  10. ensp中ap获取不到ip_对比网络模拟器软件,Cisco Packet Tracer、华为eNSP、H3C Cloud Lab...