java – 有没有可重入的ReadWriteLock我可以使用?

我需要一个不可重入的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);
}
相关文章
相关标签/搜索