当前位置: 首页 > 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

相关文章:

  • 使用 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)
  • 医药级食品树脂杜笙树脂医药溶液去除苦味溶液净化
  • 为惩戒“工贼”,美国编剧工会“痛下杀手”
  • 美国拟向阿联酋和沙特AI公司出口数十万枚芯片
  • 沈阳一超市疑借领养名义烹食流浪狗,当地市监局:已收到多起投诉
  • 欧元区财长会讨论国际形势及应对美国关税政策
  • 行知读书会|换一个角度看见社会
  • 上海建筑领域绿色发展2025年工作要点发布