我可以使用不可重入的ReadWriteLock吗?

And*_*lay 14 java concurrency locking

我需要一个不可重入的ReadWriteLock,因为锁可能会被一个不同于获取它的线程释放.(当我开始间歇性地获得IllegalMonitorStateException时,我意识到了这一点.)

我不确定非重入是否是正确的术语.ReentrantLock允许当前持有的线程锁定以再次获取它.我不想要这种行为,因此我称之为"不可重入".

上下文是我有一个使用线程池的套接字服务器.每个连接没有线程.请求可能由不同的线程处理.客户端连接可能需要锁定一个请求并在另一个请求中解锁.由于请求可能由不同的线程处理,我需要能够在不同的线程中锁定和解锁.

假设为了这个问题,我需要保持这种配置,并且我确实需要锁定和解锁不同的请求,因此可能是不同的线程.

这是一个ReadWriteLock,因为我需要允许多个"读者"或一个独家"作家".

看起来这可以使用AbstractQueuedSynchronizer编写,但我担心如果我自己编写它会犯一些微妙的错误.我可以找到使用AbstractQueuedSynchronizer而不是ReadWriteLock的各种示例.

我可以使用OpenJDK ReentrantReadWriteLock源并尝试删除可重入部分,但我再次害怕我不会理解它.

我看过Guava和Apache Commons但没找到合适的东西.Apache Commons有RWLockManager可能会做我需要的但我不确定它似乎比我需要的更复杂.

Ben*_*nes 30

信号量允许不同的线程执行许可的获取和释放.独占写入相当于具有所有许可,因为线程等待直到所有许可都被释放并且其他线程不能获得额外的许可.

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);
}
Run Code Online (Sandbox Code Playgroud)