Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么时候使用ReentrantReadWriteLock类的readLock()方法安全?_Java_Multithreading_Reentrantreadwritelock - Fatal编程技术网

Java 什么时候使用ReentrantReadWriteLock类的readLock()方法安全?

Java 什么时候使用ReentrantReadWriteLock类的readLock()方法安全?,java,multithreading,reentrantreadwritelock,Java,Multithreading,Reentrantreadwritelock,很明显,在读取文件时使用readLock(例如),在写入文件时使用writeLock是合适的。但是,如果我有一个比较两个值的操作,例如: if (i == j) { System.out.println("equal); } 那么可以使用readLock()而不是writeLock来锁定此代码吗?当然,我没有写任何东西,但我在比较两者 值,这与仅读取数据略有不同,因为涉及到一个操作。请记住,“i”或“j”随时可能发生变化。理论上,readLock()只有在writeLock()不修改资

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

if (i == j) {
    System.out.println("equal);
}
那么可以使用readLock()而不是writeLock来锁定此代码吗?当然,我没有写任何东西,但我在比较两者 值,这与仅读取数据略有不同,因为涉及到一个操作。请记住,“i”或“j”随时可能发生变化。理论上,readLock()只有在writeLock()不修改资源的情况下才会向前移动,但我可能无法完全理解这个问题的所有复杂性。看起来似乎有一个灰色区域的潜力,所以我想我应该得到一些信息

谢谢大家,


Matt

虽然我认为将Ij作为易失性同步修改访问应该足够了

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


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

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

要回答你的问题,这要看情况

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


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

@user654801是的,确切地说,您还必须同步我在回答中提到的修改访问。您在独占和共享方面提出了很好的观点。我在实际代码中比较的两个值来自1)另一个类中返回值的方法(必要时锁定),以及2)我的方法中未同步的局部变量。如果另一个线程调用这些变量,这些变量可以立即更改,但是readLock()应该注意到这一点,并停止读取这些值(如果它们更改正确)?非常感谢大家。