JUC - ReentrantReadWriteLock(读写锁)

本文通过一个示例展示了如何利用ReentrantReadWriteLock来实现并发控制。在模拟的缓存Map中,put方法使用写锁确保同一时间只有一个线程写入,而get方法则使用读锁允许多个线程并行读取,以此提高并发性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ReentrantReadWriteLock
在读的时候可以多个线程一起读, 在写的时候,只能一个线程写。

场景:
用Map模拟一个缓存,put方法是用写锁加锁, get用读锁加锁。

public class Test4 {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();
        for (int i = 1; i <= 5; i++) {
            final int temp = i;
            new Thread(() -> {
                myCache.put(temp + "", temp + "");
            }, String.valueOf(i)).start();
        }
        for (int i = 1; i <= 5; i++) {
            final int temp = i;
            new Thread(() -> {
                myCache.get(temp + "");
            }, String.valueOf(i)).start();
        }
    }
}

class MyCache {
    private volatile Map<String, Object> map = new HashMap<>();
    private ReadWriteLock lock = new ReentrantReadWriteLock();
    //写 只有一个线程写
    public void put(String key, Object value) {
        lock.writeLock().lock();
        System.out.println(Thread.currentThread().getName() + "写入:" + value);
        map.put(key, value);
        System.out.println(Thread.currentThread().getName() + "写入完毕:" + value);
        lock.writeLock().unlock();
    }

    //读 可以多个线程读
    public Object get(String key) {
        lock.readLock().lock();
        System.out.println(Thread.currentThread().getName() + "读取:");
        Object o = map.get(key);
        System.out.println(Thread.currentThread().getName() + "读取完毕:" + o);
        lock.readLock().unlock();
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值