Есть ли нереентерабельный ReadWriteLock, который я могу использовать?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Есть ли нереентерабельный ReadWriteLock, который я могу использовать?

Сообщение Anonymous »

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

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

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

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

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

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

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

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

Подробнее здесь: https://stackoverflow.com/questions/107 ... -i-can-use
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»