Java中的读写锁(ReadWriteLock)是并发编程中的一种高级锁机制,允许多个读线程同时访问共享资源,但在写线程访问时,所有的读线程和其他写线程都会被阻塞。这种机制可以提高并发性能,因为读操作之间是互不影响的。
Java并发包(java.util.concurrent
)中提供了ReadWriteLock
接口及其实现类ReentrantReadWriteLock
。
ReadWriteLock
接口
ReadWriteLock
接口定义了两个锁:
readLock()
:返回一个锁用来控制读操作。writeLock()
:返回一个锁用来控制写操作。
ReentrantReadWriteLock
实现
ReentrantReadWriteLock
是ReadWriteLock
接口的一个实现,提供了可重入的读写锁。
示例:使用ReentrantReadWriteLock
实现线程安全的读写操作
代码说明
- 创建读写锁:
ReadWriteLock rwLock = new ReentrantReadWriteLock();
。- 写线程(Writer):
- 获取写锁:
rwLock.writeLock().lock();
。- 执行写操作并模拟延迟:
sharedData++;
和Thread.sleep(1000);
。- 释放写锁:
rwLock.writeLock().unlock();
。- 读线程(Reader):
- 获取读锁:
rwLock.readLock().lock();
。- 执行读操作并模拟延迟:
System.out.println(sharedData);
和Thread.sleep(500);
。- 释放读锁:
rwLock.readLock().unlock();
。
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Library {
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private final ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
private final ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
public void readBook() {
readLock.lock(); // 获取读锁
try {
System.out.println(Thread.currentThread().getName() + " is reading");
Thread.sleep(1000); // 模拟读书
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
readLock.unlock(); // 释放读锁
}
}
public void writeBook() {
writeLock.lock(); // 获取写锁
try {
System.out.println(Thread.currentThread().getName() + " is writing");
Thread.sleep(1000); // 模拟借书
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
writeLock.unlock(); // 释放写锁
}
}
public static void main(String[] args) {
Library library = new Library();
// 启动一些读线程
for (int i = 0; i < 5; i++) {
new Thread(library::readBook).start();
}
// 启动一些写线程
for (int i = 0; i < 2; i++) {
new Thread(library::writeBook).start();
}
}
}