读写锁 ReadWriteLock

ReadWriteLock 的作用

ReadWriteLock 是 Java 提供的一种读写锁机制,用于优化多线程环境下对共享资源的访问性能。其核心思想是:

  1. 读锁(Read Lock):允许多个线程同时读取共享资源(读-读共享)。
  2. 写锁(Write Lock):仅允许一个线程独占资源进行写操作(写-写互斥,读-写互斥)。

适用场景

  • 读多写少的场景(如缓存、数据库查询)。
  • 需要提高读操作的并发性,同时保证写操作的独占性。
package com.chstack.learning.concurrent.lock;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 *  读写锁案例:缓存读写
 *  接口:ReadWriteLock
 *  唯一实现类:ReentrantReadWriteLock
 *  共享:读-读共享
 *  互斥:写-写互斥,读-写互斥
 */
public class ReadWriteLockDemo {

    public static void main(String[] args) {
        MyCache cache = new MyCache();
        // 读取线程
        for (int i = 0; i < 5; i++) {
            int temp = i+1;
            new Thread(()->{ cache.put(String.valueOf(temp), temp); }).start();
        }
        // 写入线程
        for (int i = 0; i < 5; i++) {
            int temp = i+1;
            new Thread(()->{ cache.get(String.valueOf(temp)); }).start();
        }
    }
}

class MyCache {

    ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    Map<String, Integer> data = new HashMap<>();

    public void put(String key, Integer value) {
        readWriteLock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() + " 开始写入:" + key);
            data.put(key, value);
            System.out.println(Thread.currentThread().getName() + " 写入完毕:" + key);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            readWriteLock.writeLock().unlock();
        }
    }

    public void get(String key) {
        readWriteLock.readLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() + " 开始读取:" + key);
            data.get(key);
            System.out.println(Thread.currentThread().getName() + " 读取完毕:" + key);
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            readWriteLock.readLock().unlock();
        }
    }
}
This article was updated on