Можем ли мы вызвать синхронизированный метод объекта внутри конструктора объекта в Java? - PullRequest
4 голосов
/ 12 июня 2019

Я новичок в Java. Мне интересно, если можно вызвать синхронизированный метод внутри конструктора. Вот пример:

class a{
    int a1;

    public a(){
        a1 = 1;
        increment();
    }

    private synchronized void increment(){
        a1++;
    }
}

Это игрушечный пример. Я могу просто установить a1 на 2 в конструкторе. Я просто запутался, можем ли мы вызвать increment() внутри конструктора или нет.

1 Ответ

7 голосов
/ 12 июня 2019

Вы можете сделать это, но эта синхронизация не имеет смысла, потому что синхронизированный метод заблокирует экземпляр, который в данный момент создается. Но какой другой поток может получить к нему доступ, пока он еще не создан и не возвращен? Никто.
Конструкторы действительно де-факто защищены от многопотоковых операций, если вы следуете рекомендациям, таким как не передавать this другим классам / объектам внутри тела конструктора.
Ваш пример может иметь больше смысла с методом synchronized static или synchronized в поле static.

...