Подтвердить что ты не робот

Не могли бы вы объяснить порядок блокировки?

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

A.lock();
B.lock();
B.unlock();
A.unlock();

Но что произойдет, если мне это понравится:

A.lock();
B.lock();
A.unlock();
B.unlock();

Я пытаюсь сделать тупиковый сценарий, но если я всегда блокирую А раньше, то Б, то я не знаю, как произойдет тупик. Вы мне поможете?

4b9b3361

Ответ 1

Блокировка упорядочивания означает, что вы предотвращаете взаимоблокировки путем получения блокировок в фиксированном порядке и не получаете блокировки снова после начала разблокировки.

Я не думаю, что порядок разблокировки здесь имеет какое-то значение (на самом деле, должно быть полезно освободить замок как можно скорее, даже если он не работает)

Ответ 2

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

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

Рассмотрим:

A.lock();
B.lock();
Foo();
A.unlock();
Bar();
B.unlock();

Если Bar() пытается перезагрузить A, вы действительно нарушили порядок блокировки. Вы держите B, а затем пытаетесь получить A. Теперь он может тупик.

Если вы разблокируете стиль в обратном порядке (что очень естественно, если вы используете RAII):

A.lock();
B.lock();
Foo();
B.unlock();
Bar();
A.unlock();

тогда не имеет значения, пытается ли Bar() сделать блокировку, так как блокировка будет сохранена.

Ответ 3

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

Thread 1

A.lock();
B.lock();
B.unlock();
A.unlock();

Thread 2

B.lock();
A.lock();
A.unlock();
B.unlock();

Ответ 4

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

Дальнейшее чтение

Ответ 5

Порядок разблокировки не повлияет на то, как ваша система зашла в тупик, однако есть причины подумать о порядке разблокировки:

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

Ответ 6

А для Java разблокировка выполняется в обратном порядке, если synchronized ключевое слово используется для блокировки. Невозможно разблокировать в другом порядке использование ключевого слова synchronized.

synchronized(a) {
  synchronized(b) {
    // statements
  }
}

Ответ 7

      > lock(B)                                                                                                                                                                                                 
      >  ----------    lock(C)
      >  ----------    lock(B)    >>>> would block here 
      >  ----------    release(B)
      >  ----------    release(C)
      > lock(C)       >>>>>> would block here 
      > release(B)
      > release(C)

Их ответ велик, вот еще одна ситуация, когда может произойти блокировка, если выполняется неупорядоченная блокировка и освобождение. Одно слово, Unordered release и блокировка нарушают предположение, которое мы использовали для разработки нашего общего управления ресурсами и критической зоны.