Java面试要点87 - Java读写锁实现ReadWriteLock深度剖析

在这里插入图片描述


一、引言

在Java并发编程中,读写锁(ReadWriteLock)是一种重要的同步机制,它允许多个线程同时读取共享资源,但在写入时需要独占访问。这种机制在读多写少的场景下能显著提高系统性能。

二、ReadWriteLock基本概念

ReadWriteLock提供了两种类型的锁:读锁(共享锁)和写锁(独占锁)。多个线程可以同时持有读锁,但写锁是互斥的。

下面是一个基本示例:

public class ReadWriteLockBasics {
   
   
    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
    private final Lock readLock = rwLock.readLock();
    private final Lock writeLock = rwLock.writeLock();
    private final Map<String, String> data = new HashMap<>();
    
    public String read(String key) {
   
   
        readLock.lock();
        try {
   
   
            // 模拟读取操作耗时
            Thread.sleep(100);
            return data.get(key);
        } catch (InterruptedException e) {
   
   
            Thread.currentThread().interrupt();
            return null;
        } finally {
   
   
            readLock.unlock();
        }
    }
    
    public void write(String key, String value) {
   
   
        writeLock.lock();
        try {
   
   
            // 模拟写入操作耗时
            Thread.sleep(200);
            data.put(key, value);
        } catch (InterruptedException e) {
   
   
            Thread.currentThread().interrupt();
        } finally {
   
   
            writeLock.unlock();
        }
    }
}

三、高级特性实现

3.1 锁降级

锁降级是读写锁的一个重要特性,它允许持有写锁的线程在不释放写锁的情况下获取读锁:

public class LockDowngradeExample {
   
   
    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
    private final Lock readLock = rwLock.readLock();
    private final Lock writeLock = rwLock.writeLock();
    
    private volatile String data;
    private volatile boolean dataValid;
    
    public String processData() {
   
   
        writeLock.lock();  // 获取写锁
        try {
   
   
            if (!dataValid) {
   
   
                data = loadUpdatedData();  // 更新数据
                dataValid = true;
            }
            
            readLock.lock();  // 在释放写锁之前获取读锁
            try {
   
   
                writeLock.unlock();  // 释放写锁但保持读锁
                return processDataWithReadLock();  // 使用读锁处理数据
            } finally {
   
   
                readLock.unlock();  // 最后释放读锁
            }
        } finally {
   
   
            if (writeLock.tryLock()) {
   
     // 检查写锁是否仍被持有
                writeLock.unlock();
            }
        }
    }
    
    private String loadUpdatedData() {
   
   
        // 模拟加载新数据
        return "Updated Data " + System.currentTimeMillis();
    }
    
    private String processDataWithReadLock() {
   
   
        // 使用读锁处理数据
        return data.toUpperCase
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值