java - 什么时候使用 ReentrantReadWriteLock 类的 readLock() 方法是安全的?

标签 java multithreading reentrantreadwritelock

很明显,在从文件读取时使用 readLock(例如),在写入文件时使用 writeLock 是合适的。但是,如果我有一个比较两个值的操作,例如:

if (i == j) {
    System.out.println("equal);
}

那么使用readLock()而不是writeLock来锁定这段代码可以吗?当然,我没有写任何东西,但我正在比较两个 值,这与读取数据有点不同,因为涉及到操作。请记住,“i”或“j”可能随时更改。理论上,只有当 writeLock() 没有修改资源时,readLock() 才会继续前进,但我可能无法完全理解这个问题的所有复杂性。似乎可能存在一些灰色区域,所以我想我会得到一些意见。

谢谢大家,

马特

最佳答案

不要从读和写的角度来考虑读/写锁,将它们视为独占/共享。写锁是独占的,读锁是共享的。

要回答您的问题,这取决于情况。

假设您有 1 个线程正在更新 i,一个线程正在更新 j,另一个线程正在检查相等性。在这种情况下,写入线程将获取共享(读)锁,因为它们都可以并行操作,因为每个线程仅更新 1 个变量。然后,比较线程可以获得排它锁(写锁)来比较并执行操作,从而防止执行操作时发生任何更新。

因此请考虑独占/共享以及您的应用程序的需求是什么。

关于java - 什么时候使用 ReentrantReadWriteLock 类的 readLock() 方法是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5321248/

相关文章:

java - 我可以将 java.util.concurrent.locks.Lock 更改为 java.util.concurrent.locks.ReentrantReadWriteLock;

java - 无法安装 JDK 7

java - 如何以多线程方式运行H2数据库?

java - 如何使用 dragger 2 创建带有模拟数据的单例类?

java - 一个线程可以在另一个线程完成静态初始化(类加载)之前进入静态方法吗?

c# - 异步函数进行异步调用

java - 自动编译线程类中的类。请解释

java - 检查 `ReentrantReadWriteLock` 中是否拥有 readLock

java - 在 ReentrantReadWriteLock 中是否有 WriteLock 优先于 ReadLock

java - 致命异常: AsyncTask #1, android远程数据库注册