ロックを取得したスレッドとは異なるスレッドによってロックが解放される可能性があるため、再入可能ではないReadWriteLockが必要です。(これは、IllegalMonitorStateExceptionが断続的に発生し始めたときにわかりました。)
非再入可能が正しい用語であるかどうかはわかりません。ReentrantLockを使用すると、現在保持しているスレッドをロックして、再度取得できます。私はこの振る舞いを望まないので、それを「非再入可能」と呼んでいます。
コンテキストは、スレッドプールを使用するソケットサーバーがあるということです。接続ごとにスレッドはありません。リクエストは異なるスレッドによって処理される場合があります。クライアント接続では、あるリクエストをロックインし、別のリクエストをロック解除する必要がある場合があります。リクエストは異なるスレッドで処理される可能性があるため、異なるスレッドでロックおよびロック解除できる必要があります。
この質問のために、私はこの構成を維持する必要があり、実際にはさまざまな要求、したがっておそらくさまざまなスレッドでロックおよびロック解除する必要があると想定します。
複数の「リーダー」または排他的な「ライター」を許可する必要があるため、これはReadWriteLockです。
これはAbstractQueuedSynchronizerを使用して記述できるようですが、自分で記述した場合、微妙な間違いを犯してしまうのではないかと心配しています。AbstractQueuedSynchronizerを使用したさまざまな例を見つけることができますが、ReadWriteLockは見つかりません。
OpenJDK ReentrantReadWriteLockソースを取得して、再入可能部分を削除しようとすることもできますが、正しく理解できないのではないかと心配しています。
GuavaとApacheCommonsを調べましたが、適切なものは見つかりませんでした。Apache CommonsにはRWLockManagerがあり、必要なことを実行できる可能性がありますが、よくわかりません。必要以上に複雑に見えます。