2016-05-23 2 views
0

Мы имели шаблоны проектирования в школе и научились реализации одноточечного (ленивый/не Потокобезопасные один), как это:Ленивого Singleton какие преимуществ над Потокобезопасными один

package com.crunchify.tutorials; 
public class CrunchifySingleton { 

    private static CrunchifySingleton instance = null; 

    protected CrunchifySingleton() { 
    } 

    // Lazy Initialization (If required then only) 
    public static CrunchifySingleton getInstance() { 
     if (instance == null) { 
      // Thread Safe. Might be costly operation in some case 
      synchronized (CrunchifySingleton.class) { 
       if (instance == null) { 
        instance = new CrunchifySingleton(); 
       } 
      } 
     } 
     return instance; 
    } 
} 

Теперь я нашел реализацию, как это:

package com.crunchify.tutorials; 

public class ThreadSafeSingleton { 

    private static final Object instance = new Object(); 

    private ThreadSafeSingleton() { 
    } 

    // Runtime initialization 
    // By defualt ThreadSafe 
    public static Object getInstance() { 
     return instance; 
    } 
} 

Теперь мне интересно, когда первая реализация имеет смысл использовать, потому что в соответствии с http://crunchify.com/thread-safe-and-a-fast-singleton-implementation-in-java/ второй является поточно и требует меньше линий.

+1

Да, но второй не ленив. – Kayaman

+0

@ Кайаман: В чем преимущество, когда синглтон ленив, а не потокобезопасен? Это то, чего я не получаю. Спасибо за ваш ответ! – Gildraths

+1

Число раз, когда одноэлемент действительно необходим, очень мало; количество раз, на которое вам действительно нужен лениво-инициализированный ленивый синглтон, еще меньше. –

ответ

0

Разница во времени создается экземпляр объекта singleton. Второй фрагмент создает экземпляр объекта singleton только один раз во время создания экземпляра класса. Это полезно, если для этого процесса не требуются дополнительные данные. Обратите внимание, что при возникновении ошибки создания экземпляра (не имеет значения в этом простом случае: просто Object) singleton-класс вообще не будет доступен.

Первый снипп создает экземпляр объекта singleton при его запросе. Вы можете изменить этот класс, чтобы предоставить некоторый механизм для хранения любых данных инициализации и/или ошибок при создании экземпляра.

0

как предотвратить множественные экземпляры Singleton по каким-либо причинам. Двойная проверка блокировки Singleton - это способ гарантировать, что только один экземпляр класса Singleton создается через жизненный цикл приложения. Как следует из названия, при двойном проверке блокировки проверка кода на существующий экземпляр класса Singleton дважды с блокировкой и без нее гарантирует, что создается не более одного экземпляра singleton.

Смежные вопросы