
读写锁 ReadWriteLock
ReadWriteLock 的作用
ReadWriteLock 是 Java 提供的一种读写锁机制,用于优化多线程环境下对共享资源的访问性能。其核心思想是:
- 读锁(Read Lock):允许多个线程同时读取共享资源(读-读共享)。
- 写锁(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();
}
}
}