一、什么是读写锁

读写锁是JDK1.5提供的一个工具锁,适用于读多写少的场景,将读写分离,从而提高并发性。

二、读写锁的特点

  1. 读锁是共享锁,写锁是排他锁,读锁和写锁不能同时存在;
  2. 读锁不能升级为写锁;
  3. 写锁可以降级为读锁;

三、代码演示

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线程之读写锁相关推荐

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

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

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

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

  3. java 多线程 day12 读写锁

    import java.util.Random;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent. ...

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

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

  5. Java中的读/写锁

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

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

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

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

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

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

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

  9. java并发-ReentrantReadWriteLock读写锁

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

  10. Linux多线程开发-线程同步-读写锁pthread_rwlock_t

    1.读写锁概念 对资源的访问抽象为两种类型,即独占和共享.独占资源具有排他性,例如写操作.共享资源可以同时由多个线程访问,不对该资源执行写操作.针对资源的读和写操作分别加锁,写操作加锁与互斥锁相同,但 ...

最新文章

  1. go标准库的学习-crypto/aes
  2. R语言Gamma分布函数Gamma Distribution(dgamma, pgamma, qgamma rgamma)实战
  3. 使用命令创建mysql_用命令创建MySQL数据库
  4. 定义一个列表存储n个整数,求列表的长度,最大值,最小值和平均值
  5. 若依集成CIM(即时推送系统)实现将服务端修改为SpringBoot+Vue前后端分离版(文末见代码下载)
  6. 1024“代码急救室”活动来袭!机械键盘、背包等程序员装备等你来!
  7. Java黑皮书课后题第7章:7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值。编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字
  8. 5G NR基础参数及帧结构
  9. 尺度不变性是指什么不变_不变性如何提供帮助
  10. [html] 说说你对H5的ServiceWorker的理解,它有什么运用场景?
  11. 解决百度ueditor插入动态地图空白 支持iframe方法
  12. 获取选择的当前天、周、月、年的时间段
  13. MATLAB 积分 上限为变量,matlab 求定积分,积分的上限是变量,函数带有其他参数
  14. C# 如何调用打印机打印报表
  15. PID算法基本原理及整定实现方法
  16. Excel学习笔记 - 查找表格数据
  17. PR标题动画模板 创意动态多行标题注释字幕条pr模板
  18. matlab中numden函数,numden函数 MATLAB里面numden函数有什么用?
  19. 展望下未来的计算机400字,展望未来的作文400字
  20. 70年,国人的奋斗史,计算机技术的追赶史

热门文章

  1. 灰常实用的一键开关机电路,各位大佬进来mark一下?
  2. Autoit 打开文件的几种方式(run/Fileopen/ShellExecute)
  3. linux 配置vpn 客户端,mandriva下成功配置vpn客户端
  4. 数据分析——数据指标
  5. Ffplay源码read_thread解读(一)
  6. 如何在android studio中调用mumu模拟器
  7. 均匀裁剪图片(3000X3000到1000X1000)
  8. arx 锁定解锁图层 刷新透明度
  9. 计算机本地硬盘满了,本地磁盘C盘满了怎么清理?
  10. Flutter跑马灯Marquee