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; }}
转载于:https://www.cnblogs.com/ctaixw/p/7979849.html
java 多线程 day12 读写锁相关推荐
- java多线程 -- ReadWriteLock 读写锁
写一条线程,读多条线程能够提升效率. 写写/读写 需要"互斥"; 读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 ...
- 对变量移位顺序读写_Java多线程并发读写锁ReadWriteLock实现原理剖析
关于读写锁 Java语法层面的synchronized锁和JDK内置可重入锁ReentrantLock我们都经常会使用,这两种锁都属于纯粹的独占锁,也就是说这些锁任意时刻只能由一个线程持有,其它线程都 ...
- java 单例 读写锁_你用对锁了吗?浅谈 Java “锁” 事
每个时代,都不会亏待会学习的人 大家好,我是yes. 本来打算继续写消息队列的东西的,但是最近在带新同事,发现新同事对于锁这方面有一些误解,所以今天就来谈谈"锁"事和 Java 中 ...
- java自己实现读写锁_关于读写锁算法的Java实现及思考
问题背景:多个线程对一个共享的资源进行读写访问.写线程之间需要互斥,读线程跟写线程需要互斥,读线程之间不用互斥. 早些时候听张sir的课,讲述java5中增强并发的功能.用java.util.conc ...
- Java中的读/写锁
原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写 ...
- java 单例 读写锁_终极锁实战:单JVM锁+分布式锁
目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的典型场景:多 ...
- java 实现队列读写锁_史上最全的Java并发系列之Java中的锁的使用和实现介绍(二)...
前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在 絮叨 上节是锁的第一 ...
- java并发-ReentrantReadWriteLock读写锁
一.概念 Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁 ...
- java线程系列---读写锁ReentrantReadWriteLock
获取顺序 此类不会将读取者优先或写入者优先强加给锁定访问的排序.但是,它确实支持可选的公平 策略.当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入.当释放写入锁定后,将写入锁定分配给等待时 ...
最新文章
- 修改squid的Header中的X-Cache为Powered-By-LinuxTone
- 自动驾驶汽车的规划与控制
- java集合类——Stack栈类与Queue队列
- 大数据风控之贷前调查必知的十大客户信息
- win10自动切换日夜模式
- 【Flutter】Dart中的继承
- java 最长 几个字节,int类型占几个字节_在java中,int类型占四个字节,而byte类型占一个字节...
- AfterEffects 不支持 MKV 格式的解决办法
- ubuntu 16.04 插入耳机没有声音
- linux如何撤销权限修改,linux 撤销权限
- python verilog就业_[持续演进] 应届生 FPGA 就业,一点微小的看法
- Terminal Emulator for Android(安卓终端模拟器)的使用
- imToken的创始人何斌:让区块链泛式革命在社区蔓延开来
- 《Pro SQL Server Internals, 2nd edition》 作者:Dmitri KorotkevitchP55-58 P62-65 P68-69
- Node.js(三)路由器、中间件、MySQL模块、RESTful接口
- STM32开发 --- 1.8寸显示屏ST7735_输出英文、汉字、图片
- C# 获取MP3/WMA音频数据信息
- 2019年 团体程序设计天梯赛——题解集
- 使用python从概率角度绘制植物叶子!
- appium java 虫师_如何在Appium中使用AI定位
热门文章
- 天才少年何恺明:高考状元的开挂人生
- 字母s开头的c语言的工具,C语言库函数(S类字母) - 3
- oracle最新scn补丁,更新:Oracle全面修正了关于DB Link和SCN补丁的公告
- java字符串 大括号_string.format格式化字符串中转义大括号“{}”
- Python---将一字符串转换为字典,并按词语出现的频率由高到低进行排列。
- 001_推箱子-绘制图片
- mysql去掉两个最高分_如何计算去掉一个最高分和一个最低分后的平均分?
- mongo备份索引_【MongoDB学习之四】索引 聚合 备份与恢复 监控
- mysql的基本介绍简书_mysql 简介
- ensp中ap获取不到ip_对比网络模拟器软件,Cisco Packet Tracer、华为eNSP、H3C Cloud Lab...