我需要一个不可重入的 ReadWriteLock,因为锁可能会由与获取它的线程不同的线程释放。 (当我开始间歇性地获得 IllegalMonitorStateException 时,我意识到了这一点。)
我不确定不可重入是否是正确的术语。 ReentrantLock 允许当前持有锁的线程再次获取它。我不想要这种行为,因此我称它为“不可重入”。
上下文是我有一个使用线程池的套接字服务器。每个连接没有一个线程。请求可能会被不同的线程处理。客户端连接可能需要在一个请求中锁定并在另一个请求中解锁。由于请求可能由不同的线程处理,因此我需要能够在不同的线程中锁定和解锁。
为了这个问题,假设我需要保留这个配置,并且我确实需要在不同的请求中锁定和解锁,因此可能需要在不同的线程中锁定和解锁。
这是一个 ReadWriteLock,因为我需要允许多个“读者”或一个独占的“作者”。
看起来这可以使用 AbstractQueuedSynchronizer 来编写,但我担心如果我自己编写它,我会犯一些微妙的错误。我可以找到各种使用 AbstractQueuedSynchronizer 而不是 ReadWriteLock 的示例。
我可以使用 OpenJDK ReentrantReadWriteLock 源代码并尝试删除可重入部分,但我还是担心我不会完全正确。
我查看了 Guava 和 Apache Commons,但没有找到合适的东西。 Apache Commons 有 RWLockManager,它可以满足我的需要,但我不确定,它似乎比我需要的更复杂。
最佳答案
信号量允许不同的线程执行许可的获取和释放。独占写入等同于拥有所有许可,因为线程会一直等待,直到所有许可都被释放,并且其他线程无法获得额外的许可。
final int PERMITS = Integer.MAX_VALUE;
Semaphore semaphore = new Semaphore(PERMITS);
// read
semaphore.acquire(1);
try { ... }
finally {
semaphore.release(1);
}
// write
semaphore.acquire(PERMITS);
try { ... }
finally {
semaphore.release(PERMITS);
}
关于java - 我可以使用不可重入的 ReadWriteLock 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10711447/