提问人:Juan Gil 提问时间:4/25/2021 更新时间:4/25/2021 访问量:326
写锁有优先访问java读写锁中的临界区域吗?[关闭]
Write locks have priority to access the critical region in a java readWrite lock? [closed]
问:
我需要编写器线程优先访问关键区域而不是读取器线程,我可以使用 ReadWriteLock 接口来执行此操作吗?
答:
2赞
BeUndead
4/25/2021
#1
虽然没有直接使用 ,但对于这样的事情,最简单的内置方法可能是 ,它确实支持公平性。创建一个公平的,具有(有效)无限数量的应该就足够了:ReadWriteLock
Semaphore
Semaphore
permis
private static final Semaphore lock = new Semaphore(Integer.MAX_VALUE, true);
public void doReadLocked() throws InterruptedException {
// 'Read' lock only acquires one permit, but since there are A LOT,
// many of them can run at once.
lock.acquire();
try {
// Do your stuff in here...
} finally {
// Make sure you release afterwards.
lock.release();
}
}
public void doWriteLocked() throws InterruptedException {
// 'Write' lock demands ALL the permits. Since fairness is set, this
// will 'take priority' over other waiting 'read'ers waiting to acquire
// permits.
lock.acquire(Integer.MAX_VALUE);
try {
// Do your stuff in here...
} finally {
// Make sure you release afterwards.
lock.release(Integer.MAX_VALUE);
}
}
评论
0赞
Tsyvarev
4/26/2021
根据文档,信号量支持的唯一一种“公平性”是 FIFO 一:当多个线程等待信号量时,较早调用的线程将获胜。所以你的评论看起来不是正确的。(“这将'优先'于其他等待获得许可证的'读取'者。.acquire()
lock.acquire(Integer.MAX_VALUE);
0赞
BeUndead
4/26/2021
任何“读取”线程都能够立即获取锁。因此,由于“写入”锁现在是队列中的第一个,因此在写入之前,将无法再获取读锁。这是 OP 要求的行为。但是,如果在第一次写入时第二次写入到达,则可能需要处理更多操作。
0赞
Tsyvarev
4/26/2021
哦,明白了。但。。你测试过你的代码吗?我希望这不会等待,而是立即进行:公平只是等待。lock.acquire();
lock.acquire(Integer.MAX_VALUE);
1赞
BeUndead
4/26/2021
@Tsyvarev ideone.com/LvWsBN 我尝试在这里快速检查。看起来它按预期工作,但我可能搞砸了测试用例。:/每个 println 开头括号中的数字是我当时预期的计数。
2赞
Holger
4/26/2021
这并不比公平模式好。当存在挂起时,下一个将在它之后排队,就像当有较旧的写锁尝试时(在公平模式下)将挂起的读锁尝试排队一样。但是,当另一个尝试到来时,它不会超过之前排队的尝试,因此仍然没有写入器优先级。ReentrantReadWriteLock
acquire(Integer.MAX_VALUE)
acquire()
acquire(Integer.MAX_VALUE)
acquire()
评论