Вопрос по multithreading, java, concurrency – Java: вложенные блоки синхронизации

18

Я видел это в одном из Heinz Kabutz'sJava Specialist выпуски информационных бюллетеней и, хотя остальные (и, действительно, все) статьи д-ра Кабуца хорошо объяснены и подробны, он, похоже, затушевывает, что делает этот код, или, что более важно, его значение:

<code>public class SomeObject {
    private Object lock1;
    private Object lock2;

    public void doSomething() {
        synchronized(lock1) {
            synchronized(lock2) {
                // ...
            }
        }
    }
}
</code>

Каковы последствия вложенностиsynchronized блоки? Как это влияет на разные темы, пытающиесяdoSomething()?

Какую статью вы читали? Jeffrey
В этом сценарии все потоки будут заблокированы во внешней блокировке, пока она не будет освобождена потоком во внутренней блокировке. Hunter McMillen
Снимок, который вы опубликовали, ничего не делает; единственная нить, которая может иметьlock2 это тот, который имеетlock1, Не зная, что представляет собой остальная часть кода и для чего используются эти блокировки, невозможно ответить. Brian Roach

Ваш Ответ

3   ответа
30

Есть 2 возможных проблемы, на которые нужно обратить внимание

  1. Nested locks can result in deadlocks quite easily if one is using wait/notify. Here is an explanation of why. http://tutorials.jenkov.com/java-concurrency/nested-monitor-lockout.html

  2. One should be wary that if another method wishes to lock the same two objects, they must always do it in the same order, otherwise there is the possibility of another deadlock situation as explained in this post: How to avoid Nested synchronization and the resulting deadlock

Error: User Rate Limit Exceededen.wikipedia.org/wiki/Deadlock_prevention_algorithms
Error: User Rate Limit Exceeded
0

Учебник по блокировке вложенного монитора

In nested monitor lockout, Thread 1 is holding a lock A, and waits for a signal from Thread 2. Thread 2 needs the lock A to send the signal to Thread 1. While in deadlock, two threads are waiting for each other to release locks.

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

1

Но проблема может прийти в виде тупика, если есть что-то вроде этого кода; где у нас есть два метода с синхронизированными блоками таким образом, что объекты блокируются в противоположных порядках

public void doSomething() {
    synchronized(lock1) {
        synchronized(lock2) {
            // ...
        }
    }
}

public void doOtherthing() {
    synchronized(lock2) {
        synchronized(lock1) {
            // ...
        }
    } 
}

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

Похожие вопросы