2015-08-30 2 views
1

Я читаю о одиночках, и не понимаю, почему этоСамый эффективный одноэлементный узор?

public class BillPughSingleton { 
    private BillPughSingleton(){} 

    private static class SingletonHelper{ 
     private static final BillPughSingleton INSTANCE = new BillPughSingleton(); 
    } 

    public static BillPughSingleton getInstance(){ 
     return SingletonHelper.INSTANCE; 
    } 
} 

является более эффективным, чем это

public static ThreadSafeSingleton getInstanceUsingDoubleLocking(){ 
    if(instance == null){ 
     synchronized (ThreadSafeSingleton.class) { 
      if(instance == null){ 
       instance = new ThreadSafeSingleton(); 
      } 
     } 
    } 
    return instance; 
} 
+0

Не забывайте 'volatile', если вы используете блокировку с двойной проверкой. Начиная с java 1.5 дважды проверенные блокировки работают с 'volatile'. См. Https://en.wikipedia.org/wiki/Double-checked_locking –

ответ

1

Первого шаблон экономят вам хлопоты и производительность «накладные расходы» проверка на null s - загрузчик классов должен гарантировать, что класс загружается и инициализируется только один раз.

+0

о методе getInstance? Может ли быть нестационарным? – user3289157

+0

@ user3289157 он должен быть 'static'. Поскольку вы не сможете создать экземпляр извне класса (конструктор является закрытым), это будет единственным способом получить экземпляр (!!) Класса. – Mureinik

+0

Что значит делать статичным? Может ли быть несколько «экземпляров» одной функции одновременно? – user3289157

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