2013-07-20 4 views
0

я проходил через шаблон проектирования и столкнулось с Singleton PatternSingleton Pattern в Java

class SingletonPattern implements Runnable { 
    private static SingletonPattern single=null; 

    private SingletonPattern() { } 

    public synchronized static SingletonPattern getInstance() { 
     if(null==single) { 
      single=new SingletonPattern(); 
     } 
     return single; 
    } 
} 

Теперь я понимаю, что синхронизируется поможет, что две нити не могут получить доступ к методу GetInstance но поправьте меня, если я ошибаюсь, две разные объект будет иметь две блокировки, каждая из которых имеет один. Другой поток можно запустить из объекта anther и получить затем доступ к методу getInstance(), таким образом, мы можем иметь два объекта.

+1

Замок приобретается здесь не по типу объекта. – NINCOMPOOP

+1

его метод «статической синхронизации», поэтому блокировка будет получена на объекте класса «SingletonPattern». проверьте этот поток http://stackoverflow.com/questions/437620/java-synchronized-static-methods-lock-on-object-or-class – sanbhat

ответ

2

№. Синхронизированный метод предотвратит одновременный вызов двух потоков. Вы можете читать по синхронизации here. В случае метода static синхронизированный действует на класс, а не на объект.

Однако этот способ создания синглтонов неэффективен. И Double Checked Locking не работает. Лучший способ сделать одиночные игры в java - использовать Enum

+0

Ok Затем синглтон-паттерн говорит, что в течение определенного периода может быть только один экземпляр класса –

+0

@Deepak_Sharma - вы конструктор является закрытым - поэтому никто не может создать экземпляр класса, кроме метода getInstance. – user93353

+0

Идиома двойной проверки нарушена, но почему синхронизация вокруг метода работает неправильно? Все кэши нитей обновляются правильно, прежде чем войти в систему и покраснет после выхода. ??? – morpheus05

0

Синтаксис переменной является статическим. То есть, все экземпляры класса SingletonPattern используют один и тот же синтаксис переменных. Первый раз функция деЫпзЬапс() выполнение, переменные одного равен нуль, так

single = new SingletonPattern(); 

выполняется, что делает переменные одного не обнулить больше.

Тогда все последующие вызовы функции getInstance() не будут входить в предложение if, таким образом, возвращать одну и ту же переменную single, которая является ссылкой на тот же экземпляр класса SingletonPattern.

Также ключевое слово synchronized гарантирует, что функция getINstance() не будет вызываться в двух потоках одновременно.

+0

отличным способом ... большое спасибо всем –

0

Нет. Поскольку getInstance и single являются статическими, оба потока будут использовать один и тот же метод и объект, поэтому не будет двух объектов. synchronized гарантирует, что они не будут получать доступ одновременно внутри. getInstance

0

Синхронизированный статический метод приобретет блокировку классов, и для всех объектов этого класса существует единственный замок класса. Следовательно, другим объектам будет запрещено получать этот замок одновременно.

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

Хотя лучший способ реализовать синглтоны в java - использовать перечисления