我需要一个不可重入的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);
}

07-24 21:30