Создание экземпляра синглтона java

Я нашел три способа создания экземпляра синглтона, но я сомневаюсь, лучший ли какой-либо из них. Я использую их в многопоточной среде и предпочитаю ленивое создание экземпляров.
Пример 1:

private static final ClassName INSTANCE = new ClassName();

public static ClassName getInstance() {
    return INSTANCE;
}

Пример 2:

private static class SingletonHolder { 
    public static final ClassName INSTANCE = new ClassName();
}

public static ClassName getInstance() {
    return SingletonHolder.INSTANCE;
}

Пример 3:

private static ClassName INSTANCE;

public static synchronized ClassName getInstance()
{
    if (INSTANCE == null)
        INSTANCE = new ClassName();

    return INSTANCE;
}

В проекте, который я использую ATM, везде используется Пример 2, но мне больше нравится Пример 3. Есть еще версия Enum, но я ее просто не понимаю.

Здесь возникает вопрос - в каких случаях мне следует / не следует использовать какие-либо из этих вариантов? Я не ищу пространных объяснений (на эту тему есть много других тем, но все они в конечном итоге превращаются в споры ИМО), я бы хотел, чтобы это было понятно в нескольких словах.

9
задан jurchiks 16 January 2011 в 15:35
поделиться