Получить последнее значение, вставленное в набор

Reentrancy означает, что блокировки получаются по потоку, а не по каждому вызову.

Это вводящее в заблуждение определение. Это правда (вроде), но это не соответствует реальной точке.

Reentrancy означает (в общем, терминологию CS / IT), что вы что-то делаете, и пока вы все еще это делаете, вы делаете это снова. В случае замков это означает, что вы делаете что-то вроде этого в одном потоке :

  1. Приобретайте блокировку на «foo».
  2. Do что-то
  3. Приобретите блокировку на «foo». Обратите внимание, что мы еще не выпустили блокировку, которую мы ранее приобрели.
  4. ...
  5. Блокировать блокировку на «foo»
  6. ...
  7. Блокировка фиксации на «foo»

С помощью механизма блокировки / блокировки реентера попытка получить тот же замок будет успешной и будет увеличивать внутренний счетчик, принадлежащий блокировке. Блокировка будет освобождена только тогда, когда текущий держатель блокировки выпустил его дважды.

Вот пример в Java, использующий примитивные блоки / мониторы объектов ... которые являются реентерабельными:

Object lock = new Object();
...
synchronized (lock) {
    ...
    doSomething(lock, ...)
    ...
}

public void doSomething(Object lock, ...) {
    synchronized (lock) {
        ...
    }
}

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

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


Так что мне не нужно учитывать взаимоблокировки?

Да, вы это делаете.

Нить не будет зациклена на себя (если блокировка реентерабельной). Тем не менее, вы можете получить тупик, если есть другие потоки, которые могут блокировать объект, который вы пытаетесь заблокировать.

30
задан Tamas Hegedus 17 February 2019 в 04:54
поделиться