2016-03-14 3 views
0

Я пытаюсь реализовать модель Singleton для нижележащего класса. Я должен иметь только один экземпляр класса SingletonClass в любое время в JVM.Singleton pattern с блокировкой объекта

Под нижним кодом соответствует шаблон Singleton? пожалуйста, предоставьте свои предложения.

public class SingletonClass { 

    private static SingletonClass cache = null; 
    private static final Object LOCK = new Object(); 


    // creates one single instance of the class 
    public static SingletonClass getInstance() { 
     if (cache == null) { 
      synchronized (LOCK) { 
       if (cache == null) { 
        cache = new SingletonClass(); 
       } 
      } 
     } 

     return cache; 
    } 

    public static void main(String[] args) { 

     SingletonClass.getInstance(); 
    } 
} 
+1

Возможный дубликат [Что такое эффективный способ реализовать одноплодной шаблон в Java?] (Http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement -a-singleton-pattern-in-java) – Kai

+0

@Kai Я проверил вопросы о singleton. Мой вопрос в том, что над кодом следует шаблон или нет. Не как его реализовать. Я не вижу его дубликата для вашего downvote. – ulab

+1

Тогда это тоже оффтоп. –

ответ

2

Существует хорошая статья о различных подходах реализации одноэлементный шаблона, включая пути: Reg's Tech article about Singleton

Как уже упоминалось в статье, вы должны (если вы хотите шаблон, чтобы быть 100% поточно) также объявить поле SingletonClass нестабильным. Также вам не нужен объект как блокировка. Просто используйте synchronized(SingletonClass.class)

+0

Спасибо. да, единственное различие касается темы синхронизации. Есть ли недостаток, если я использую 'Object' в качестве блокировки в Singleton? – ulab

+1

Единственный недостаток, с которым я столкнулся, заключается в том, что у вас есть дополнительное поле в вашем классе. Но я должен сказать, что способ использования частного статического конечного объекта как блокировки может иметь преимущество наличия блокировки, доступной только в вашем классе. В качестве блокировки можно использовать SingletonClass.class вне вашего фактического класса. –

0

Здесь неблокирующая попытка реализовать одноэлементную ссылку.

public class SingletonReference { 
    private static volatile SingletonReference instance; 
    private static final Lock lock = new ReentrantLock(); 

    public static SingletonReference getInstance() { 
     if (instance == null) { 
     // if the singleton reference is null. Multiple threads can make it concurrently 
     try { 
      // keep looping until the thread is able acquire the lock 
      while (!lock.tryLock()) ; 

       // one thread at a time because other threads will be busy waiting in the loop above 
       if (instance == null) { 
        // if the instance is still null then it either means that this is the first attempt to create this object 
        // or the previous attempt to create the instance failed. Let's try again!! 
        instance = new SingletonReference(); 
       } 
      } finally { 
       // release the lock 
       lock.unlock(); 
      } 
     } 

     return instance; 
    } 
}