Синглтон - PullRequest
       18

Синглтон

1 голос
/ 05 декабря 2010

Следующий фрагмент прямо,

public MyClass getInstance() {
    if(uniqueInstance == null) {
        uniqueInstance = new MyClass();
    }
    return uniqueInstance;
}

Что делает следующий?

public MyClass getInstance() {
    if(uniqueInstance == null) {
        synchronized(MyClass.class) {
            uniqueInstance = new MyClass();
        }
    }
    return uniqueInstance;
}

Ответы [ 4 ]

5 голосов
/ 05 декабря 2010

Это плохая попытка сделать потокобезопасным, чтобы предотвратить состояние гонки, вызванное, по крайней мере, двумя потоками, которые одновременно вошли в блок if.

Немного более безопасный подход - добавление дополнительной проверки нуля, такжеизвестный как двойная проверка блокировки .

public MyClass getInstance() {
    if (uniqueInstance == null) {
        synchronized(MyClass.class) {
            if (uniqueInstance == null) {
                uniqueInstance = new MyClass();
            }
        }
    }
    return uniqueInstance;
}

Тем не менее, я обычно предпочитаю Просто создать один шаблон над синглтоном.

3 голосов
/ 05 декабря 2010

ИМХО Сначала вы должны начать с самых простых вариантов.Самый простой синглтон - это перечисление с одной записью.Учитывая, что классы загружаются лениво, это все равно даст вам ленивую загрузку, если только вы не обращаетесь к классу напрямую, и это не случайно происходит легко.

enum Singleton {
   INSTANCE;
}

Чтобы избежать случайной загрузки, вы можете использовать внутреннийкласс.

class Singleton {
    static class SingeltonHolder {
        static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

Примечание;ни одно из решений не нуждается в синхронизации, поскольку они используют тот факт, что загрузка классов является поточно-ориентированной.

Короче говоря;Есть ситуации, когда требуется блокировка, но не усложняйте ее.

3 голосов
/ 05 декабря 2010

Это небольшая гарантия безопасности потока.

Из статьи javaworld здесь :

Синхронизация метода гарантирует, что вызов методане может быть прервановы даже должны иметь данные о состоянии в единственном экземпляре)

1 голос
/ 05 декабря 2010

Второй делает то же самое, за исключением: если вы используете первый, что произойдет, если создание нового MyClass займет некоторое время, и в течение этого времени кто-то еще также вызывает MyClass.getInstance ()?Вы могли бы потенциально получить два экземпляра.Вторая версия блокирует строку создания экземпляра, так что, если другой класс попытается вызвать одновременно, он будет ждать до завершения первого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...