想象一下,有一个特别珍贵的书籍收藏室,里面存放着一些非常有价值的书籍。为了保护这些书籍,同时又能让尽可能多的人查阅它们,图书馆制定了一套特殊的访问规则:
- 多人阅读:如果一个人只是想进来阅读(不修改书籍),那么其他也想阅读的人可以同时进入。这意味着多个读者可以在同一时间查阅书籍。
- 单人写作:如果有一个人需要对书籍进行编辑或更新(写入),那么在他们完成之前,任何人都不能进来阅读或编辑,以确保数据的一致性和准确性。
- 优先级转换:一旦有人开始编辑书籍,所有的人都必须等待直到编辑完成;而当没有人在编辑时,读者可以自由进出。
ReadWriteLock 在图书馆中的应用
在 Java 中,ReadWriteLock
就是用于实现这样的规则。它包含两个锁:一个读锁和一个写锁。下面是这个概念的代码表示:
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Library {
private final ReadWriteLock lock = new ReentrantReadWriteLock();
// 用于模拟读者的行为
public void readBook() {
lock.readLock().lock(); // 获取读锁
try {
// 模拟读取书籍的过程
System.out.println("正在阅读书籍...");
} finally {
lock.readLock().unlock(); // 释放读锁
}
}
// 用于模拟编辑者的行为
public void editBook() {
lock.writeLock().lock(); // 获取写锁
try {
// 模拟编辑书籍的过程
System.out.println("正在编辑书籍...");
} finally {
lock.writeLock().unlock(); // 释放写锁
}
}
}
日常情景
- 多人阅读场景:当有多个读者想要查阅书籍时,他们都可以获取读锁,并且可以同时阅读。因为此时没有写操作发生,所以不会有冲突。
- 单人写作场景:当有编辑人员想要更新书籍内容时,他需要先获得写锁。一旦获得了写锁,所有其他的读请求和写请求都将被阻塞,直到编辑工作完成并释放了写锁。
- 从读到写的转换:如果当前有多人在阅读,而这时有人想要编辑书籍,这个人将不得不等待所有当前的读者完成他们的阅读之后才能得到写锁。
通过这种方式,ReadWriteLock
提供了一种更加细粒度的并发控制机制,允许更多的线程在同一时间进行非破坏性的读取操作,只有在确实需要修改共享资源时才阻止其他任何类型的访问。这提高了系统的效率和响应速度,特别是在读操作远多于写操作的情况下。