Что означает «неблокированная блокировка»? - PullRequest
0 голосов
/ 10 января 2020

Я читаю Java Параллелизм на практике . В 13.1 Lock и ReentrantLock говорится:

Зачем создавать новый механизм блокировки, который так похож на блокировку intrinsi c? Блокировка Intrinsi c прекрасно работает в большинстве ситуаций, но имеет некоторые функциональные ограничения - невозможно прервать поток, ожидающий получения блокировки, или попытаться получить блокировку, не желая ждать ее вечно. Блокировки Intrinsi c также должны быть освобождены в том же блоке кода, в котором они получены; это упрощает кодирование и хорошо взаимодействует с обработкой исключений, но делает невозможным неблокированную блокировку дисциплин.

Что означает «неблокированная структурная блокировка» ? Я думаю, это означает, что вы можете заблокировать в одном методе, разблокировать в другом методе, например Lock, но блокировки intrinsi c должны быть сняты в том же блоке кода, в котором они были получены. Я прав?

Но китайская версия этой книги переводит "блок" в " 阻塞 ". Это ошибка?

1 Ответ

3 голосов
/ 10 января 2020

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

Lock lock = ...
lock.acquire();
try {
    // do stuff
} finally {
    lock.release();
}

Альтернатива («блокировка без блочной структуры») просто означает, что указанное выше ограничение не применяется. Вы можете делать такие вещи, как получение блокировки одним методом и освобождение его другим. Или (гипотетически) даже передать блокировку другому потоку, чтобы освободить 1 . Проблема в том, что этот вид кода намного сложнее получить, и его сложнее анализировать, чем примеры, подобные приведенному выше.

1 - Осторожно. Если вы передаете полученные блокировки между потоками, вы можете столкнуться с аномалиями памяти или, что еще хуже. На самом деле, я даже не уверен, что это допустимо в Java.


«Блочная структура», упомянутая в цитируемом тексте, явно говорит о лексической структуре кода. , согласно статье в Википедии о блоке topi c (программирование) . Если в китайской версии Java параллелизма на практике используются символы, означающие «блокирование» в смысле Блокирование (программирование) , то это неправильный перевод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...