java线程之读写锁
一、什么是读写锁
读写锁是JDK1.5提供的一个工具锁,适用于读多写少的场景,将读写分离,从而提高并发性。
二、读写锁的特点
- 读锁是共享锁,写锁是排他锁,读锁和写锁不能同时存在;
- 读锁不能升级为写锁;
- 写锁可以降级为读锁;
三、代码演示
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;//定义缓存
public class MyCache {private volatile Map<String, Object> cache = new HashMap<>();//读写锁private final ReadWriteLock rwLock = new ReentrantReadWriteLock();//获取写锁private final Lock wlock = rwLock.writeLock();//获取读锁private final Lock rLock = rwLock.readLock();// 写数据public void put(String key, Object value) throws InterruptedException {//加锁wlock.lock();try {System.out.println(Thread.currentThread().getName() + ",写入数据:" + key);TimeUnit.SECONDS.sleep(2);cache.put(key, value);System.out.println(Thread.currentThread().getName() + ",写入数据完成:" + key);} finally {//释放锁wlock.unlock();}}//读数据public Object get(String key) throws InterruptedException {Object res = cache.get(key);//加锁rLock.lock();try {System.out.println(Thread.currentThread().getName() + ",读数据:" + key);TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName() + ",读数据完成:" + key);} finally {//释放锁rLock.unlock();return res;}}}
1、共享读
public static void main(String[] args) {MyCache cache=new MyCache();for (int i = 0; i < 5; i++) {String key=String.valueOf(i+1);new Thread(()->{try {cache.get(key);} catch (InterruptedException e) {e.printStackTrace();}},"read-"+key).start();}}
2、独占写
public static void main(String[] args) {MyCache cache=new MyCache();for (int i = 0; i < 5; i++) {String key=String.valueOf(i+1);new Thread(()->{String str = UUID.randomUUID().toString();try {cache.put(key,str.substring(4,10));} catch (InterruptedException e) {e.printStackTrace();}},"wirte-"+key).start();}}
3、写锁降级为读锁,可以写读
public static void main(String[] args) {//读写锁final ReadWriteLock rwLock = new ReentrantReadWriteLock();//获取写锁final Lock wlock = rwLock.writeLock();//获取读锁final Lock rLock = rwLock.readLock();//加锁wlock.lock();System.out.println("写锁开始工作");rLock.lock();System.out.println("读锁开始工作");wlock.unlock();rLock.unlock();}
4、锁升级,不可以读写
public static void main(String[] args) {//读写锁final ReadWriteLock rwLock = new ReentrantReadWriteLock();//获取写锁final Lock wlock = rwLock.writeLock();//获取读锁final Lock rLock = rwLock.readLock();//加锁rLock.lock();System.out.println("读锁开始工作");wlock.lock();System.out.println("写锁开始工作");rLock.unlock();wlock.unlock();}
ReentrantReadWriteLock适合于读多写少的场合,可以提高并发效率,而ReentrantLock适合普通场合
CSDN话题挑战赛第1期
活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f
java线程之读写锁相关推荐
- java线程系列---读写锁ReentrantReadWriteLock
获取顺序 此类不会将读取者优先或写入者优先强加给锁定访问的排序.但是,它确实支持可选的公平 策略.当公平地构造线程时,线程利用一个近似到达顺序的策略来争夺进入.当释放写入锁定后,将写入锁定分配给等待时 ...
- java自己实现读写锁_关于读写锁算法的Java实现及思考
问题背景:多个线程对一个共享的资源进行读写访问.写线程之间需要互斥,读线程跟写线程需要互斥,读线程之间不用互斥. 早些时候听张sir的课,讲述java5中增强并发的功能.用java.util.conc ...
- java 多线程 day12 读写锁
import java.util.Random;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent. ...
- java多线程 -- ReadWriteLock 读写锁
写一条线程,读多条线程能够提升效率. 写写/读写 需要"互斥"; 读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 ...
- Java中的读/写锁
原文链接 作者:Jakob Jenkov 译者:微凉 校对:丁一 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源的读和写操作,且写 ...
- java 单例 读写锁_终极锁实战:单JVM锁+分布式锁
目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的典型场景:多 ...
- java 单例 读写锁_你用对锁了吗?浅谈 Java “锁” 事
每个时代,都不会亏待会学习的人 大家好,我是yes. 本来打算继续写消息队列的东西的,但是最近在带新同事,发现新同事对于锁这方面有一些误解,所以今天就来谈谈"锁"事和 Java 中 ...
- java 实现队列读写锁_史上最全的Java并发系列之Java中的锁的使用和实现介绍(二)...
前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在 絮叨 上节是锁的第一 ...
- java并发-ReentrantReadWriteLock读写锁
一.概念 Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞.读写锁维护了一对锁,一个读锁 ...
- Linux多线程开发-线程同步-读写锁pthread_rwlock_t
1.读写锁概念 对资源的访问抽象为两种类型,即独占和共享.独占资源具有排他性,例如写操作.共享资源可以同时由多个线程访问,不对该资源执行写操作.针对资源的读和写操作分别加锁,写操作加锁与互斥锁相同,但 ...
最新文章
- go标准库的学习-crypto/aes
- R语言Gamma分布函数Gamma Distribution(dgamma, pgamma, qgamma rgamma)实战
- 使用命令创建mysql_用命令创建MySQL数据库
- 定义一个列表存储n个整数,求列表的长度,最大值,最小值和平均值
- 若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版(文末见代码下载)
- 1024“代码急救室”活动来袭!机械键盘、背包等程序员装备等你来!
- Java黑皮书课后题第7章:7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值。编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字
- 5G NR基础参数及帧结构
- 尺度不变性是指什么不变_不变性如何提供帮助
- [html] 说说你对H5的ServiceWorker的理解,它有什么运用场景?
- 解决百度ueditor插入动态地图空白 支持iframe方法
- 获取选择的当前天、周、月、年的时间段
- MATLAB 积分 上限为变量,matlab 求定积分,积分的上限是变量,函数带有其他参数
- C# 如何调用打印机打印报表
- PID算法基本原理及整定实现方法
- Excel学习笔记 - 查找表格数据
- PR标题动画模板 创意动态多行标题注释字幕条pr模板
- matlab中numden函数,numden函数 MATLAB里面numden函数有什么用?
- 展望下未来的计算机400字,展望未来的作文400字
- 70年,国人的奋斗史,计算机技术的追赶史