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

Java读写锁(ReentrantReadWriteLock )学习笔记

读写锁底层实现

state是一个32位的int值,使用高16位表示读锁,低16位表示写锁。

读锁:有读锁已经锁定的情况下,其他读锁可以继续加锁,写锁阻塞。

写锁:写锁持有时,其他读锁和写锁都阻塞。

使用场景

读多写少的情况,比如cache系统。

经典问题

什么是读写锁的锁降级?

锁降级是指在一个线程已经获取了写锁的情况下,再获取读锁,然后释放写锁的过程。在Java的ReentrantReadWriteLock中,如果当前线程已经拥有写锁,它可以继续获取读锁而不被阻塞。然而,只有当释放写锁后再获取读锁时,才称为真正的锁降级‌

读写锁的锁降级是用来解决什么问题的?

在实际应用中,锁降级常用于需要先写后读的场景。例如,一个线程首先获取写锁进行数据修改,然后通过锁降级获取读锁,以便其他线程可以安全地读取数据。这样可以避免在单线程下由于先写后读导致的读写不一致问题‌

锁降级可解决单线程下写读不一致的问题。比如该单线程先获取写锁写入i=1; 释放写锁后,再来读取该变量i,可能变量此时已经变成了i=2;(在线程释放写锁获取读锁前,该变量被其他线程获得了写锁并修改为2)

使用案例代码

public class CachedData {
    private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
    private Object data;
    private boolean cacheValid;

    public void processCachedData() {
        // Acquire read lock
        rwl.readLock().lock();
        if (!cacheValid) {
            // Must release read lock before acquiring write lock
            rwl.readLock().unlock();
            rwl.writeLock().lock();
            try {
                // Recheck state because another thread might have
                // acquired write lock and changed state before we did
                if (!cacheValid) {
                    data = fetchDataFromDatabase();
                    cacheValid = true;
                }
                // Downgrade by acquiring read lock before releasing write lock
                rwl.readLock().lock();
            } finally {
                rwl.writeLock().unlock(); // Unlock write, still hold read
            }
        }

        try {
            use(data);
        } finally {
            rwl.readLock().unlock();
        }
    }

    private Object fetchDataFromDatabase() {
        // Simulate fetching data from a database
        return new Object();
    }

    private void use(Object data) {
        // Simulate using the data
        System.out.println("使用数据: " + data);
    }

    public static void main(String[] args) {
        CachedData cachedData = new CachedData();
        cachedData.processCachedData();
    }
}

学习资料:

深入理解Java并发读写锁ReentrantReadWriteLock | 二哥的Java进阶之路

谈谈Java的读写锁-锁降级和锁升级_java 读写锁 锁升降级-CSDN博客


http://www.kler.cn/a/374060.html

相关文章:

  • Z 检验和 T 检验之间的区别
  • 【测试工具】通过Jmeter压测存储过程
  • 【工具变量】自由贸易试验区试点DID数据集(2003-2023年)
  • 2024-10-30 学习人工智能的Day18
  • 一七一、React性能优化方式
  • C++ 中回调函数的实现方式-函数指针
  • KKFileView v4.4.0文件预览服务 编译和window运行和nginx代理设置
  • 安科瑞Acrel-1000DP分布式光伏系统
  • <collection> 和 <association>的详细用法(附详细代码解析)
  • vue3+pinia实现状态管理和持久化存储
  • 工业网络监控中的IP保护与软件授权革新
  • [LeetCode] 494. 目标和
  • ffmpeg 提取mp4文件中的音频文件并保存
  • 重塑社区治理:王鹏谈Vitalik Buterin的去中心化理念
  • 前端如何解决浏览器input输入框密码自动填充的问题
  • 配置DDNS结合光猫路由器实现外网映射
  • Docker 60个常用命令汇总
  • springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)
  • 丢失有一段时间时的数据可以找回吗?可以!
  • Rust 知识的 20 道练习题和详细解答
  • 【JVM】——GC垃圾回收机制(图解通俗易懂)
  • nginx 路径匹配,关于“/“对规则的影响
  • 多厂商的实现不同vlan间通信
  • LLM速览篇【241-270】
  • 高效网络自动化:Python在网络基础中的应用
  • [论文精读]LoRA: Low-Rank Adaptation of Large Language Models