当前位置: 首页 > news >正文

关于读写锁的一些理解

同一线程的两种情况:

读读:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();readLock.lock();System.out.println("read1");readLock.lock();System.out.println("read2");readLock.unlock();readLock.unlock();}

输出:可重入

读写:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();readLock.lock();System.out.println("read1");writeLock.lock();System.out.println("write1");writeLock.unlock();readLock.unlock();}

输出:阻塞了。

写写:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();writeLock.lock();System.out.println("write1");writeLock.lock();System.out.println("write2");writeLock.unlock();writeLock.unlock();}

输出:可重入

写读:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();writeLock.lock();System.out.println("write1");readLock.lock();System.out.println("read1");readLock.unlock();writeLock.unlock();}

输出:文心一言说这种情况是锁降级,我不懂

不同线程的两种情况:

读读:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();readLock.lock();System.out.println("read1");Thread otherRead = new Thread(new Runnable() {@Overridepublic void run() {readLock.lock();System.out.println("otherRead");readLock.unlock();}});otherRead.start();otherRead.join();readLock.unlock();}

输出:

read1
otherRead

读写:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();readLock.lock();System.out.println("read1");Thread otherRead = new Thread(new Runnable() {@Overridepublic void run() {writeLock.lock();System.out.println("otherWrite");writeLock.unlock();}});otherRead.start();otherRead.join();readLock.unlock();}

输出:

read1

写写:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();writeLock.lock();System.out.println("write");Thread otherRead = new Thread(new Runnable() {@Overridepublic void run() {writeLock.lock();System.out.println("otherWrite");writeLock.unlock();}});otherRead.start();otherRead.join();//等待其他线程完成。但是otherRead无法获取到锁,被阻塞。writeLock.unlock();}

输出:

write

写读:

    public static void main(String[] args) throws InterruptedException {ReentrantReadWriteLock lock = new ReentrantReadWriteLock();Lock readLock = lock.readLock();Lock writeLock = lock.writeLock();writeLock.lock();System.out.println("write");Thread otherRead = new Thread(new Runnable() {@Overridepublic void run() {readLock.lock();System.out.println("otherRead");readLock.unlock();}});otherRead.start();otherRead.join();//依旧被阻塞,获取不到读锁writeLock.unlock();}

输出:

write

http://www.dtcms.com/a/186722.html

相关文章:

  • 使用 Comparator 和 Comparable 对集合排序:如何轻松排序 Java 集合?
  • Edge Remover v18.7 绿色版:轻松卸载 Edge 浏览器,彻底清理残留数据
  • Electron学习大纲
  • linux-进程信号的产生
  • 可编辑PPT | 企业数字底座:数据中台构建路径、方法和实践数据中台架构解决方案
  • 解锁遥感数据密码:DeepSeek、Python 与 OpenCV 的协同之力
  • Python教程(四)参数提取pymysql
  • LeetCode算法题:电话号码的字母组合
  • T2000云腾边缘计算盒子在数猪场景中的应用|YOLOv8+NodeRED
  • 软考 系统架构设计师系列知识点之杂项集萃(57)
  • VS2019 - 修正导出项目的工程模板的错误
  • UI自动化测试框架:PO 模式+数据驱动
  • 长度最小的子数组(leetcode)
  • 联想混合式AI的“动力总成”构建记
  • 【Redis 进阶】哨兵模式
  • KUKA机器人中断编程2—中断相关的指令
  • JDK 安装与配置
  • cursor Too many报错 显示锁机器码怎么办?也就是Cursor的
  • 配置集群(yarn)
  • 医药级食品树脂杜笙树脂医药溶液去除苦味溶液净化
  • 未来技术展望:光子量子计算集成与连续变量可视化
  • CATIA高效工作指南——常规配置篇(二)
  • Kotlin与Qt跨平台框架深度解析:业务逻辑共享与多语言集成
  • 51 单片机头文件 reg51.h 和 reg52.h 详解
  • C++编程练习,认识面向对象权限,如何进行封装
  • 深度解析mybatisplus中出现的循环依赖问题
  • (自用)Java学习-5.9(Thymeleaf,自动装配,自定义启动器 )
  • 旋转图像算法讲解
  • YOLOv8网络结构
  • 判断一个数是不是素数的最高效的算法