Не могли бы вы объяснить порядок блокировки?
Я узнал, что я должен разблокировать обратный порядок, чтобы заблокировать порядок.
Например.
A.lock();
B.lock();
B.unlock();
A.unlock();
Но что произойдет, если мне это понравится:
A.lock();
B.lock();
A.unlock();
B.unlock();
Я пытаюсь сделать тупиковый сценарий,
но если я всегда блокирую А раньше, то Б, то я не знаю, как произойдет тупик.
Вы мне поможете?
Ответы
Ответ 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 и блокировка нарушают предположение, которое мы использовали для разработки нашего общего управления ресурсами и критической зоны.