В чем разница между синхронизированным (этим) и синхронизированным методом - PullRequest
29 голосов
/ 09 декабря 2010

Допустим, у нас есть 2 примера кода:

public synchronized void getSomething(){
     this.hello = "hello World";
}

и этот

public void getSomething(){
   synchronized(this){
     this.hello = "hello World";
   }
}

Значит, кто-нибудь может сказать мне, в чем разница?

Ответы [ 3 ]

38 голосов
/ 09 декабря 2010

Два разных метода функционально эквивалентны . может иметь очень маленькую производительность разница:

На уровне байт-кода синхронизированный метод объявляет о необходимости синхронизации в виде набора битовв флаге доступа метода.JVM ищет этот битовый флаг и выполняет соответствующую синхронизацию.

Синхронизированный блок осуществляет свою синхронизацию посредством последовательности операций с байт-кодом, хранящихся в определении метода файла класса.

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

Опять же, по спецификации, они функционально идентичны.

Я предполагаю, что разница в производительности незначительна, и правила стиля кода должны победить.Некоторые компиляторы могут даже оптимизировать блок в флаг доступа.И JIT может убрать разницу в производительности.

19 голосов
/ 09 декабря 2010

Ознакомьтесь с этой частью этой статьи:

http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/#4

Это объясняет, что при функциональной конгруэнтности (синхронизация метода либо блокирует экземпляр объекта Object, либо в случае статического методаобъект класса класса, в котором находится метод), синхронизация метода гораздо более оптимальна, потому что вместо синхронизации в байт-коде (как это делают операторы синхронизированного блока) она синхронизируется на уровне JVM.

9 голосов
/ 09 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...