Мне нужен ReadWriteLock, который НЕ реентерабелен, потому что блокировка может быть выпущена другим потоком, чем тот, который его приобрел. (Я понял это, когда я начал периодически прерывать IllegalMonitorStateException.)Есть ли не реентерабельный ReadWriteLock, который я могу использовать?
Я не уверен, что нереферентом является правильный термин. ReentrantLock позволяет потоку, который в настоящее время удерживает, блокировать, чтобы снова получить его. Я НЕ хочу этого поведения, поэтому я называю его «неретеррантным».
Контекст заключается в том, что у меня есть сервер сокетов с использованием пула потоков. В каждом соединении нет нити. Запросы могут обрабатываться различными потоками. Клиентскому соединению может потребоваться блокировка в одном запросе и разблокировка в другом запросе. Поскольку запросы могут обрабатываться разными потоками, я должен иметь возможность блокировки и разблокировки в разных потоках.
Предположим ради этого вопроса, что мне нужно оставаться с этой конфигурацией, и что мне действительно нужно блокировать и разблокировать различные запросы и, следовательно, разные потоки.
Это ReadWriteLock, потому что мне нужно разрешить несколько «читателей» или эксклюзивный «писатель».
Похоже, это может быть написано с использованием AbstractQueuedSynchronizer, но я боюсь, что если я напишу сам, сделаю какую-то тонкую ошибку. Я могу найти различные примеры использования AbstractQueuedSynchronizer, но не ReadWriteLock.
Я мог бы взять источник OpenJDK ReentrantReadWriteLock и попытаться удалить реентерабельную часть, но, боюсь, я не получу ее совершенно правильно.
Я смотрел в Guava и Apache Commons, но не нашел ничего подходящего. У Apache Commons есть RWLockManager, который может делать то, что мне нужно, но я не уверен, и это кажется более сложным, чем мне нужно.
Спасибо, похоже, это может сделать трюк. Чтение документов для Семафора звучит так, как будто мне нужно указать «справедливый» вариант. «Этот класс также предоставляет удобные методы для одновременного получения и выпуска нескольких разрешений. Остерегайтесь повышенного риска неопределенной отсрочки, когда эти методы используются без справедливости. –
И я вижу, что Семафор реализован (по крайней мере, в OpenJDK) с AbstractQueuedSynchronizer –
Удивительный! Я оказываюсь в одной лодке (нужен r/w-замок за многопоточным/объединенным бережливым сервером). Этот вопрос и ответ - вот что мне нужно! Благодаря! – akagixxer