何时使用ReentrantReadWriteLock类的readLock()方法是否安全?

时间:2011-03-16 05:01:12

标签: java multithreading reentrantreadwritelock

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

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

那么可以使用readLock()而不是writeLock来锁定这段代码吗?当然,我不会写任何东西,但我比较两个 由于涉及操作,因此与仅读取数据有点不同。请记住,“i”或“j”可能随时发生变化。理论上,如果writeLock()没有修改资源,readLock()只会前进,但我可能无法完全理解这个问题的所有复杂性。看起来似乎有可能出现一些灰色区域,所以我想我会得到一些输入。

感谢大家,

马特

2 个答案:

答案 0 :(得分:3)

不要在读写方面考虑读/写锁,将它们视为独占/共享。写锁是独占的,读锁是共享的。

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

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

因此,请考虑排他/共享,以及您的应用程序的需求。

答案 1 :(得分:0)

虽然我认为将 i j 设为易失性并且同步修改对它的访问就足够了。

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

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