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

В чем разница между синхронизированным (это) и синхронизированным методом

Предположим, что у нас есть два примера кода:

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

и этот

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

Итак, кто-то может сказать мне, какая разница сейчас?

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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