ReadWriteLock通过读共享、写独占机制提升读多写少场景下的并发性能,相比ReentrantLock能显著减少读操作的等待时间,提高吞吐量。

在Java中,使用
ReadWriteLock
synchronized
ReentrantLock
在Java中,
java.util.concurrent.locks.ReentrantReadWriteLock
ReadWriteLock
ReentrantReadWriteLock
readLock()
writeLock()
基本的模式是这样的:
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.Lock;
public class DataStore {
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private final Lock readLock = rwLock.readLock();
private final Lock writeLock = rwLock.writeLock();
private String data = "Initial Data";
public String readData() {
readLock.lock(); // 获取读锁
try {
// 模拟读取操作
System.out.println(Thread.currentThread().getName() + " is reading data: " + data);
Thread.sleep(50); // 模拟耗时
return data;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return null;
} finally {
readLock.unlock(); // 释放读锁
}
}
public void writeData(String newData) {
writeLock.lock(); // 获取写锁
try {
// 模拟写入操作
System.out.println(Thread.currentThread().getName() + " is writing data: " + newData);
this.data = newData;
Thread.sleep(100); // 模拟耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
writeLock.unlock(); // 释放写锁
}
}
public static void main(String[] args) {
DataStore store = new DataStore();
// 启动多个读取线程
for (int i = 0; i < 5; i++) {
new Thread(() -> store.readData(), "Reader-" + i).start();
}
// 启动一个写入线程
new Thread(() -> store.writeData("New Data 1"), "Writer-1").start();
new Thread(() -> store.writeData("New Data 2"), "Writer-2").start();
// 再次启动读取线程,观察写入后的数据
try {
Thread.sleep(500); // 等待一些操作完成
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
for (int i = 5; i < 10; i++) {
new Thread(() -> store.readData(), "Reader-" + i).start();
}
}
}这段代码展示了
ReadWriteLock
readLock
writeLock
立即学习“Java免费学习笔记(深入)”;
这个问题,在我看来,核心在于“效率”和“场景匹配度”。当我们在处理并发数据时,最常见的锁是
ReentrantLock
然而,现实世界的数据访问模式往往是“读多写少”。比如一个配置中心,配置一旦加载,大部分时间都是被读取,只有偶尔才会被更新。如果这时我们还用
ReentrantLock
ReadWriteLock
所以,如果你的应用场景是读操作远超写操作,那么
ReadWriteLock
ReentrantLock
synchronized
ReadWriteLock
谈到
ReadWriteLock
Android文档-开发者指南-第一部分:入门-中英文对照版 Android提供了丰富的应用程序框架,它允许您在Java语言环境中构建移动设备的创新应用程序和游戏。在左侧导航中列出的文档提供了有关如何使用Android的各种API来构建应用程序的详细信息。第一部分:Introduction(入门) 0、Introduction to Android(引进到Android) 1、Application Fundamentals(应用程序基础) 2、Device Compatibility(设备兼容性) 3、
11
锁升级(Read-to-Write Upgrade): 这个概念听起来很诱人:我先拿着读锁,发现需要修改数据了,就直接把读锁“升级”成写锁。但遗憾的是,
ReentrantReadWriteLock
ReentrantReadWriteLock
锁降级(Write-to-Read Downgrade): 与升级相反,锁降级是支持的,而且在某些场景下非常有用。它的流程是:
这个机制有什么用呢?想象一下,你修改了一段数据,现在想在允许其他线程读取的同时,自己也需要继续读取这个最新修改的数据,并且确保这段时间没有其他线程来修改它。通过降级,你可以在释放写锁后,立即让其他读者进来,而你自己的线程仍然可以安全地读取,因为你还持有读锁。这样既保证了修改后的数据立即可读,又避免了在读操作时再次排队等待。
public void processAndReadData(String newData) {
writeLock.lock(); // 1. 获取写锁
try {
System.out.println(Thread.currentThread().getName() + " is writing and then downgrading.");
this.data = newData; // 修改数据
// 2. 在持有写锁的同时,获取读锁
readLock.lock();
System.out.println(Thread.currentThread().getName() + " acquired read lock.");
} finally {
writeLock.unlock(); // 3. 释放写锁
System.out.println(Thread.currentThread().getName() + " released write lock.");
}
// 此时线程仍然持有读锁,可以安全地读取
try {
System.out.println(Thread.currentThread().getName() + " is reading data after downgrade: " + data);
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
readLock.unlock(); // 4. 最终释放读锁
System.out.println(Thread.currentThread().getName() + " released read lock.");
}
}锁降级是一个非常实用的模式,它允许我们在完成关键的写操作后,立即切换到读模式,从而减少写锁的持有时间,提高并发性。
ReadWriteLock
公平性与吞吐量:
ReentrantReadWriteLock
new ReentrantReadWriteLock(true)
ReentrantReadWriteLock
锁的粒度: 这是一个老生常谈的问题,但在
ReadWriteLock
ReadWriteLock
ReadWriteLock
ReadWriteLock
ConcurrentHashMap
死锁风险: 虽然
ReadWriteLock
ReadWriteLock
lock1
lock2
lock2
lock1
过度优化: 别忘了,
ReadWriteLock
ReentrantLock
synchronized
ReadWriteLock
ReadWriteLock
总的来说,
ReadWriteLock
以上就是如何在Java中使用Read Write Lock的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号