2

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

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

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

谢谢大家,

马特

4

2 回答 2

4

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

要回答你的问题,这取决于。

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

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

于 2011-03-16T05:27:59.593 回答
0

尽管我认为将ij设置为volatile同步对它的修改访问就足够了。

但是说你必须使用读写锁。在这种情况下,对于您的上述代码,您需要有一个读锁。原因是您给定的代码是非修改代码,它不会修改 i 或 j。所以其他方法确实可以并行读取 i 和 j 的值而不会损坏。您只能在修改 i 和 j 值的地方使用写锁。

编辑:突出显示“同步修改访问”以回答评论

于 2011-03-16T05:16:06.010 回答