Как реализовать поточную безопасную ленивую инициализацию? - PullRequest
42 голосов
/ 28 ноября 2011

Каковы некоторые рекомендуемые подходы для достижения поточно-ориентированного отложенной инициализации? Например,

// Not thread-safe
public Foo getInstance(){
    if(INSTANCE == null){
        INSTANCE = new Foo();
    }

    return INSTANCE;
}

Ответы [ 11 ]

0 голосов
/ 28 ноября 2011

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

Также вы использовали случай SHOUTY, который обычно указывает на static, но метод экземпляра. Если он действительно статичен, я предлагаю вам убедиться, что он никоим образом не изменяем. Если создание статического неизменяемого просто дорого, то загрузка классов в любом случае ленива. Возможно, вы захотите переместить его в другой (возможно, вложенный) класс, чтобы отложить создание до самого последнего возможного момента.

...