很明显,在读取文件(例如)时使用readLock,在写入文件时使用writeLock是合适的。但是,如果我有一个比较两个值的操作,例如:
if (i == j) {
System.out.println("equal);
}那么可以使用readLock()而不是writeLock来锁定这段代码吗?当然,我没有写任何东西,但是我比较了两个值,这与仅仅读取数据略有不同,因为涉及到一个操作。请记住,"i“或"j”随时都可能改变。理论上,只有在writeLock()没有修改资源的情况下,readLock()才会向前移动,但我可能并不完全理解这个问题的所有复杂性。只是看起来可能会有一些灰色地带,所以我想我应该得到一些意见。
感谢所有人,
哑光
发布于 2011-03-16 13:28:00
不要从读写的角度来考虑读/写锁,把它们看作是独占/共享的。写锁是独占的,读锁是共享的。
要回答你的问题,就看情况了。
假设你有一个线程在更新i,一个线程在更新j,另一个线程在检查相等性。在这种情况下,写线程将获得一个共享(读)锁,因为它们都可以并行操作,因为每个线程只更新一个变量。然后,比较线程可以获取排它锁(写锁)来比较和执行操作,从而在执行操作时阻止任何更新。
因此,从独占/共享的角度考虑,以及应用程序的需求是什么。
发布于 2011-03-16 13:16:06
尽管我认为让i和j作为、volatile、和同步修改对它的访问,应该就足够了。
但是假设你必须使用读写锁。在这种情况下,对于上面的代码,您需要有一个读锁。原因是你给出的代码是非修改代码,它不会修改i或j,所以其他方法确实可以并行读取i和j的值,而不会造成任何损坏。你只能在修改i和j的值的地方使用写锁。
编辑:高亮显示"synchronizing accesses to it“以回答评论
https://stackoverflow.com/questions/5321248
复制相似问题