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

标签 java concurrency locking

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

相关文章:

java - 为什么 Neo4jTemplate 涵盖节点数而不涵盖其内容?

django - 使用 PostgreSQL 在 Django 中获取下一个工作项

java - 使用synchronized(obj) 和声明锁之间的区别

c# - NET 3.5 中 Monitor.TryEnter 的替代方案

javascript - 'static'方法的词源是什么?

java - 什么时候在 Java 中进行类型检查

java - 在信号量中调用 wait() 之前打印

python - concurrent.futures 问题 : why only 1 worker?

c# - 线程安全的内存

java - 无法从本地 IDE 连接到 docker hbase