Мне нужен ReadWriteLock, который НЕ реентерабелен, потому что блокировка может быть выпущена другим потоком, чем тот, который его приобрел. (Я понял это, когда я начал прерывать IllegalMonitorStateException.)
Я не уверен, что верный термин не является повторным. ReentrantLock позволяет потоку, который в настоящее время удерживает, блокировать, чтобы снова получить его. Я НЕ хочу этого поведения, поэтому я называю его "неретеррантным".
Контекст заключается в том, что у меня есть сервер сокетов с использованием пула потоков. В каждом соединении нет нити. Запросы могут обрабатываться различными потоками. Клиентскому соединению может потребоваться блокировка в одном запросе и разблокировка в другом запросе. Поскольку запросы могут обрабатываться разными потоками, я должен иметь возможность блокировки и разблокировки в разных потоках.
Предположим ради этого вопроса, что мне нужно оставаться с этой конфигурацией и что мне действительно нужно блокировать и разблокировать разные запросы и, следовательно, возможно разные потоки.
Это ReadWriteLock, потому что мне нужно разрешить несколько "читателей" или эксклюзивный "писатель".
Похоже, это может быть написано с использованием AbstractQueuedSynchronizer, но я боюсь, что если я напишу сам, сделаю какую-то тонкую ошибку. Я могу найти различные примеры использования AbstractQueuedSynchronizer, но не ReadWriteLock.
Я мог бы взять исходный код OpenJDK ReentrantReadWriteLock и попытаться удалить реентеративную часть, но, боюсь, я не получу ее совершенно правильно.
Я посмотрел в Guava и Apache Commons, но не нашел ничего подходящего. У Apache Commons есть RWLockManager, который может делать то, что мне нужно, но я не уверен и кажется более сложным, чем мне нужно.