Накладные расходы на вложенные синхронизированные методы - PullRequest
0 голосов
/ 27 октября 2018

Рассмотрим следующие 2 примера:

Пример 1:

Class A {
    private final B b = new B();
    public synchronized void m1() {
        b.m2();
    }
}
Class B {
    public void m2() {
        // do something
    }
}

Пример 2:

Class A {
    B b = new B();
    public synchronized void m1() {
        b.m2();
    }
}
Class B {
    public synchronized void m2() {
        // do something
    }
}

Предполагая, что B.m2 () является только , вызываемым в A.m1 (), Сколько стоит синхронизация B.m2 (), если она уже защищена A.m1 ()? то есть добавляет ли пример 2 дополнительные издержки по сравнению с примером 1? Оптимизирует ли JVM Пример 2, чтобы он выглядел как Пример 1 *

1 Ответ

0 голосов
/ 27 октября 2018

Если вы синхронизируете m2, это потребует некоторых накладных расходов, поскольку при вводе m2 поток все равно должен будет получить блокировку для объекта b (событие, если блокировка будет всегда свободной).

JVM может определить, что синхронизация избыточна, и оптимизировать ее (т. Е. Удалить synchronized из m2), если escape-анализ включен , Если код будет оптимизирован, разница в производительности не будет. Оптимизации, которые удаляют избыточную синхронизацию, называются блокировка elision или укрупнение блокировки .

Для получения более подробной информации об анализе побега, см. Следующую ссылку .

...