很明显,在从文件读取时使用 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/