【问题标题】:Java ReentrantReadWriteLock requestsJava ReentrantReadWriteLock 请求
【发布时间】:2009-07-07 09:51:25
【问题描述】:
只是一个关于 Java 中的 ReadWriteLocks(特别是 ReentrantReadWriteLock 实现)的快速问题,因为我发现 sun 文档不清楚。
如果一个线程在另一个线程请求写锁时持有读锁会发生什么?
写锁线程是否必须等待所有当前持有的读锁被释放?
另外,在授予和释放写锁之前,是否所有新的读锁请求都会被阻止?
谢谢
【问题讨论】:
标签:
java
thread-safety
reentrantreadwritelock
readwritelock
【解决方案1】:
Javadoc 对此进行了解释:
这个类不强加读者
或作家偏好排序
锁定访问。不过确实支持
一个可选的公平
政策。当构建为公平时,
线程使用
大约到货顺序政策。
当写锁被释放时
要么是等待时间最长的单曲
writer 将被分配 write
锁定,或者如果有读者在等待
比任何作家都长,
读者将被分配阅读
锁。当构造为不公平时,
进入锁需要的顺序
不在到达顺序。在任一
情况下,如果读者是活跃的并且
作家进入锁然后没有
后续读者将被授予
直到那个作家之后的读锁
已获取并释放写入
锁。
如果一个线程在另一个线程请求写锁时持有读锁会发生什么?写锁线程是否必须等待所有当前持有的读锁被释放?
是的,作者将不得不等待。但它只会等待当前持有的读锁。稍后到达的任何读者都将在作者之后排队。
另外,在授予和释放写锁之前,是否所有新的读锁请求都会被阻塞?
是的
【解决方案2】:
ReadWriteLock 不能同时拥有写锁和读锁。例如,在持有读锁时请求写锁将导致阻塞或失败。