С тегами design pattern, computerscience, codenewbie, java.
С тегами design pattern, computerscience, codenewbie, java.
public Myclass{ // class can't be instantiated because of the 'private' constructor private MyClass() { } // It is a CLASS method. It needs the class name to refer to a static method - MyClass.getInstance() public static MyClass getInstance(){ return new MyClass(); } }
На этом этапе вы, возможно, задумались о том, как одноэлементный шаблон можно использовать для многопоточных ситуаций, таких как управление пулами ресурсов (пулы потоков, пулы подключений и т.д.) и настройка реестра (вы хотите иметь только одну копию сведений реестра вашего компьютера). Рассмотрим следующий пример.
public class Singleton{ private static Singleton UniqueInstance; // other useful instance variable here private Singleton() { } // In java, 'synchronized' forces each thread to wait its time before it can enter the method public static synchronized Singleton getInstance(){ if (UniqueInstance == null){ UniqueInstance = new Singleton(); } return UniqueInstance; } // other useful methods here }
Вы заметили что-то в приведенном выше коде? Вы правы, каждый поток будет вводить метод “getInstance()” и проверять, создается ли каждый раз “uniqueInstance”. Это накладные расходы. Представьте, что если у вас есть программа с сотнями потоков, обращающихся к методу и проверяющих условие для каждого из них, это замедлит работу вашей программы.
Для улучшения многопоточности,
- Ничего не делайте, если производительность getInstance() не критична для вашего приложения
- Перейдите к быстро созданному экземпляру, а не к лениво созданному
- Используйте “блокировку с двойной проверкой”, чтобы уменьшить использование синхронизации в getInstance(); сначала проверьте, создан ли экземпляр, если нет, то синхронизировать
public class Singleton{ // volatile ensures that multiple threads handle the uniqueInstance correctly // when it is being initialized to the singleton sintance private volatile static Singleton UniqueInstance; private Singleton() { } public static Singleton getInstance(){ if (UniqueInstance == null){ synchronized (singleton.class){ if (uniqueInstance ==null){ uniqueInstance = new Singleton(); } } } return UniqueInstance; } }
Оригинал: “https://dev.to/danlee0528/design-pattern-the-singleton-pattern-2ckp”