2016-05-22 11 views
1

Я пытаюсь создать инфраструктуру, где разные машины приобретают общие блокировки через Redisson. После того, как замок приобретается, некоторые задачи асинхронных будут сделаны, в конце концов, когда я закончу работу, я отпуская замок Redisson через нить в настоящее время работает - но я получаю следующую ошибкуRedisson release блокировки из разных тем

java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: xxxxx thread-id: 57 

Итак, я понимаю смысл этого, но так как я хочу выполнять асинхронную работу, я не могу использовать поток, чтобы выполнить выпуск.

Должен ли я использовать замки Redisson? Какое наилучшее совпадение для работы async?

+0

['Lock # unlock()'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html#unlock--) сообщает, что обычно это делает блокировка. Так что, вероятно, другой примитив, такой как Семафор, который необходим независимо от того, какую библиотеку вы используете. Изменить: нажмите слишком рано. – zapl

+0

Спасибо! Семафор Редиссона не является асинхронным AFAIK, поэтому я не могу его использовать. – AvivC

ответ

1

Как указано в zapl, Java documentation показывает, что это правильное поведение блокировки java. После обсуждения вопроса на Reddison's GitHub page, похоже, что Redisson Lock не был разработан для этого, и что Redisson Semaphore будет поддерживать асинхронные операции в ближайшее время.

В то же время я планирую выделить один поток для выполнения ВСЕХ блокировок и разблокировки. Поскольку Redisson поддерживает асинхронные, неблокирующие вызовы, это решение кажется разумным на данный момент.

0

Я бы порекомендовал использовать объект Redisson Semaphore. Начиная с версии 2.2.14 он поддерживает асинхронные операции через интерфейс RSemaphoreAsync.