Зачем использовать личную блокировку над внутренней блокировкой? - PullRequest
6 голосов
/ 22 сентября 2011

Читая о синхронизации, я наткнулся на «шаблон монитора» для инкапсуляции изменяемых состояний.

Ниже приведен пример кода

   public class MonitorLock {
      private final Object myLock = new Object();
      Widget widget;
      void someMethod() {
        synchronized(myLock) {
         // Access or modify the state of widget
        }
    }

}

Лучше ли иметь личную блокировку вместо внутренней блокировки?

1 Ответ

14 голосов
/ 22 сентября 2011

Да - это означает, что вы можете видеть весь код, который может захватить этот замок (оставляя в стороне возможность отражения).

Если вы заблокируете this (которыйто, что, как я полагаю, вы называете «встроенной блокировкой»), тогда может делать другой код:

MonitorLock foo = new MonitorLock();
synchronized(foo) {
    // Do some stuff
}

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

С «закрытой» блокировкой вы можете легко увидеть каждый фрагмент кода который получает эту блокировку, потому что все это в пределах MonitorLock.Поэтому проще рассуждать об этом замке.

...