Можно ли использовать нереентерабельный ReadWriteLock?

Мне нужен ReadWriteLock, который НЕ является реентерабельным, потому что блокировка может быть снята другим потоком, а не тем, который ее приобрел. (Я понял это, когда начал получить IllegalMonitorStateException с перерывами.)

Я не уверен, что нереентерабельный является правильным термином. ReentrantLock позволяет потоку, который в настоящее время удерживает блокировку, получить его снова. Я НЕ хочу такого поведения, поэтому я вызываю его "не реентерабельный".

Контекст таков, что у меня есть сервер сокетов, использующий пул потоков. Для каждого соединения НЕ существует ни одного потока. Запросы могут обрабатываться разными потоками. Клиентскому соединению может потребоваться заблокировать один запрос и разблокировать в другом запросе. Поскольку запросы могут обрабатываться разными потоками, мне нужно иметь возможность блокировать и разблокировать в разных потоках.

Предположим ради этого вопроса, что мне нужно остаться с этой конфигурацией и что я делаю действительно нужно блокировать и разблокировать в diffe запросы на аренду и, следовательно, возможно, разные темы.

Это блокировка ReadWriteLock, потому что мне нужно разрешить несколько «читателей» ИЛИ монопольного «писателя».

Похоже, это можно было бы написать с помощью AbstractQueuedSynchronizer, но я боюсь, что если напишу сам, то совершу небольшую ошибку. Я могу найти различные примеры использования AbstractQueuedSynchronizer, но не ReadWriteLock.

Я мог бы взять исходный код OpenJDK ReentrantReadWriteLock и попытаться удалить реентерабельную часть, но опять же боюсь, что у меня не получится.

Я просмотрел Guava и Apache Commons, но ничего подходящего не нашел. Apache Commons имеет RWLockManager, который может делать то, что мне нужно, но я не уверен, и он кажется более сложным, чем мне нужно.

14
задан Andrew McKinlay 23 May 2012 в 01:28
поделиться