Java 什么时候使用ReentrantReadWriteLock类的readLock()方法安全?
很明显,在读取文件时使用readLock(例如),在写入文件时使用writeLock是合适的。但是,如果我有一个比较两个值的操作,例如:Java 什么时候使用ReentrantReadWriteLock类的readLock()方法安全?,java,multithreading,reentrantreadwritelock,Java,Multithreading,Reentrantreadwritelock,很明显,在读取文件时使用readLock(例如),在写入文件时使用writeLock是合适的。但是,如果我有一个比较两个值的操作,例如: if (i == j) { System.out.println("equal); } 那么可以使用readLock()而不是writeLock来锁定此代码吗?当然,我没有写任何东西,但我在比较两者 值,这与仅读取数据略有不同,因为涉及到一个操作。请记住,“i”或“j”随时可能发生变化。理论上,readLock()只有在writeLock()不修改资
if (i == j) {
System.out.println("equal);
}
那么可以使用readLock()而不是writeLock来锁定此代码吗?当然,我没有写任何东西,但我在比较两者
值,这与仅读取数据略有不同,因为涉及到一个操作。请记住,“i”或“j”随时可能发生变化。理论上,readLock()只有在writeLock()不修改资源的情况下才会向前移动,但我可能无法完全理解这个问题的所有复杂性。看起来似乎有一个灰色区域的潜力,所以我想我应该得到一些信息
谢谢大家,
Matt虽然我认为将I和j作为易失性和同步修改访问应该足够了 但是,假设您必须使用读写锁。在这种情况下,对于上面的代码,您需要有一个读锁。原因是您给定的代码是非修改代码,它不修改i或j。所以其他方法确实可以并行读取i和j的值,而不会产生任何损坏。只能在修改i和j值的位置使用写锁
编辑:突出显示“同步修改访问它”以回答评论不要从读和写的角度考虑读/写锁,将它们视为独占/共享。写锁是独占的,读锁是共享的 要回答你的问题,这要看情况 假设有一个线程正在更新i,一个线程正在更新j,另一个线程正在检查是否相等。在这种情况下,写入线程将获得一个共享(读取)锁,因为它们都可以并行运行,因为每个线程只更新一个变量。然后,比较线程可以获取一个独占锁(写锁)来比较和执行一个操作,从而防止在执行该操作时进行任何更新
因此,请考虑独占/共享,以及应用程序的需求。@user654801是的,确切地说,您还必须同步我在回答中提到的修改访问。您在独占和共享方面提出了很好的观点。我在实际代码中比较的两个值来自1)另一个类中返回值的方法(必要时锁定),以及2)我的方法中未同步的局部变量。如果另一个线程调用这些变量,这些变量可以立即更改,但是readLock()应该注意到这一点,并停止读取这些值(如果它们更改正确)?非常感谢大家。