首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候使用ReentrantReadWriteLock类的readLock()方法是安全的?

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

Stack Overflow用户
提问于 2011-03-16 13:01:12
回答 2查看 559关注 0票数 2

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

代码语言:javascript
复制
if (i == j) {
    System.out.println("equal);
}

那么可以使用readLock()而不是writeLock来锁定这段代码吗?当然,我没有写任何东西,但是我比较了两个值,这与仅仅读取数据略有不同,因为涉及到一个操作。请记住,"i“或"j”随时都可能改变。理论上,只有在writeLock()没有修改资源的情况下,readLock()才会向前移动,但我可能并不完全理解这个问题的所有复杂性。只是看起来可能会有一些灰色地带,所以我想我应该得到一些意见。

感谢所有人,

哑光

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-16 13:28:00

不要从读写的角度来考虑读/写锁,把它们看作是独占/共享的。写锁是独占的,读锁是共享的。

要回答你的问题,就看情况了。

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-03-16 13:16:06

尽管我认为让ij作为、volatile、同步修改对它的访问,应该就足够了。

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

编辑:高亮显示"synchronizing accesses to it“以回答评论

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5321248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档