2015-02-11 4 views
1

Если я использую ReentrantLock в Java ... Когда поток имеет блокировку объекта и пытается получить другую блокировку другого объекта, он освобождает первый или делает это еще погоди?Вложенный монитор в Java

+0

Что заставляет вас думать, что это должно освободить другое неявно? –

+0

Меня нет .. или близко к этому вопросу. Существует причина, по которой ОП задает этот вопрос. –

+0

Спасибо за все ваши ответы –

ответ

2

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

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

2

Приобретение замка не вызывает нить, чтобы освободить любой другой замок, который он уже приобрел. The API documentation for the Lock interface заявляет, что реализации блокировки могут содержать несколько замков, и используют технику (вручную через руку запирающего), что не будет работать, если поток не мог удержать более одного замок в то время (курсив):

Хотя механизм обзора для синхронизированных методов и операторов упрощает программирование с помощью блокировок монитора и помогает избежать многих распространенных ошибок программирования, связанных с блокировками, есть случаи , где вам необходимо более гибко работать с замками. Например, некоторые алгоритмы для перемещения одновременно обработанных структур данных требуют использования «руки-руки» или «блокировки цепи»: вы приобретаете блокировку узла A, затем узел B, затем освобождаете A и приобретаете C, затем освободить B и приобрести D и так далее. Реализации интерфейса Lock позволяют использовать такие методы, позволяя блокировать , приобретенные и выпущенные в разных областях, и позволяющие получать и освобождать несколько блокировок в любом порядке.

Поскольку ReentrantLock реализует блокировку, это должно быть применимо.