Рубрики
Без рубрики

История || простоя Slack 12 мая 2020 года.

История || простоя Slack 12 мая 2020 года. С тегами design pattern, computerscience, codenewbie, java.

С тегами 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”. Это накладные расходы. Представьте, что если у вас есть программа с сотнями потоков, обращающихся к методу и проверяющих условие для каждого из них, это замедлит работу вашей программы.

Для улучшения многопоточности,

  1. Ничего не делайте, если производительность getInstance() не критична для вашего приложения
  2. Перейдите к быстро созданному экземпляру, а не к лениво созданному
  3. Используйте “блокировку с двойной проверкой”, чтобы уменьшить использование синхронизации в 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”