В чем разница между синхронизированным (это) и синхронизированным методом
Предположим, что у нас есть два примера кода:
public synchronized void getSomething(){
this.hello = "hello World";
}
и этот
public void getSomething(){
synchronized(this){
this.hello = "hello World";
}
}
Итак, кто-то может сказать мне, какая разница сейчас?
Ответы
Ответ 1
Два разных метода функционально эквивалентны. Может быть очень небольшая разница в производительности:
На уровне байт-кода синхронизированный метод сообщает о необходимости синхронизации в бит, установленном в флаге доступа к методу. JVM ищет этот бит и синхронизируется соответствующим образом.
Синхронизированный блок реализует свою синхронизацию посредством последовательности операций байт-кода, хранящихся в определении файла класса.
Таким образом, синхронизированный метод потенциально может выполняться несколько быстрее и занимать меньше места в терминах байт-кода.
Опять же, они по функциональности идентичны.
Я предполагаю, что разница в производительности незначительна, и правила стиля кода должны побеждать. Некоторые компиляторы могут даже оптимизировать блокировку в флаге доступа. И JIT может отличаться от производительности.
Ответ 2
Ознакомьтесь с этой частью этой статьи:
http://www.ibm.com/developerworks/ibm/library/it-haggar_bytecode/#4
В нем объясняется, что, хотя функционально конгруэнтный (синхронизация метода блокирует объект экземпляра или в случае статического метода объект класса класса, в котором находится этот метод), синхронизация метода намного более оптимальна, поскольку вместо синхронизация в байтовом коде (как это делают операторы синхронизированного блока), она синхронизируется на уровне JVM.
Ответ 3
Одно из отличий - это гранулярность синхронизированного кода. В первом примере вы по существу блокируете весь метод, а во втором примере будет заблокирован только раздел метода. Второй подход лучше для длинных методов, тела которых не должны полностью синхронизироваться. Лучше всего только блокировать, когда вам нужно, и как можно скорее отпустить эту блокировку для других потоков.