返回
用ReentrantReadWriteLock轻松解决并发读写难题
后端
2023-12-02 14:16:47
ReentrantReadWriteLock 简介
ReentrantReadWriteLock是一个可重入的读写锁,它允许多个线程同时读取共享资源,但只能有一个线程同时写入共享资源。ReentrantReadWriteLock具有以下特点:
- 可重入性: 一个线程可以多次获取读锁或写锁,而不会造成死锁。
- 公平性: ReentrantReadWriteLock是一个公平锁,这意味着等待获取锁的线程将按照先来先到的顺序获得锁。
- 性能高效: ReentrantReadWriteLock的性能开销很低,因此它适用于高并发场景。
ReentrantReadWriteLock 的使用
ReentrantReadWriteLock的使用非常简单,它提供了以下几个方法:
lockRead()
:获取读锁。unlockRead()
:释放读锁。lockWrite()
:获取写锁。unlockWrite()
:释放写锁。
为了演示ReentrantReadWriteLock的使用,我们创建一个简单的共享资源类:
public class SharedResource {
private int value;
public void read() {
System.out.println("Thread " + Thread.currentThread().getName() + " is reading: " + value);
}
public void write(int value) {
System.out.println("Thread " + Thread.currentThread().getName() + " is writing: " + value);
this.value = value;
}
}
接下来,我们创建一个测试类来演示如何使用ReentrantReadWriteLock来控制对共享资源的并发读写访问:
public class Test {
private static SharedResource sharedResource = new SharedResource();
private static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
public static void main(String[] args) {
// 创建多个线程来模拟并发读写
for (int i = 0; i < 10; i++) {
new Thread(() -> {
// 获取读锁
lock.readLock().lock();
try {
sharedResource.read();
} finally {
// 释放读锁
lock.readLock().unlock();
}
}).start();
new Thread(() -> {
// 获取写锁
lock.writeLock().lock();
try {
sharedResource.write(Thread.currentThread().getId());
} finally {
// 释放写锁
lock.writeLock().unlock();
}
}).start();
}
}
}
运行测试类,我们可以看到多个线程可以同时读取共享资源,但只能有一个线程同时写入共享资源。这说明ReentrantReadWriteLock能够有效地控制对共享资源的并发读写访问。
总结
ReentrantReadWriteLock是一个非常有用的并发编程工具,它能够有效地控制对共享资源的并发读写访问。ReentrantReadWriteLock的使用非常简单,它提供了几个基本的方法来获取和释放读锁和写锁。在实际项目中,我们可以根据需要使用ReentrantReadWriteLock来实现对共享资源的并发读写控制,从而提高程序的性能和可靠性。