Сеня рядом и Белла пришел. Былое
Java 242. В чем проблема сериализации Singleton?
Singleton - это шаблон проектирования, который обеспечивает создание только одного экземпляра класса в рамках одной JVM. Он достигается путем применения закрытого конструктора и статической переменной экземпляра класса. Проблема с сериализацией Singleton в Java заключается в том, что при десериализации объекта, который является Singleton-ом, может быть создан новый экземпляр, что нарушает инварианты Singleton-а. Другими словами, после десериализации может оказаться, что у нас есть два экземпляра Singleton-а вместо одного, что не соответствует предназначению шаблона...
🖥 Реализации шаблона Singleton, которые вы должны знать Singleton — это шаблон проектирования в языке Java, который гарантирует, что класс имеет только один экземпляр, и обеспечивает глобальный доступ к этому экземпляру. Синглтоны обычно используются в сценариях, где наличие нескольких экземпляров может привести к непоследовательному или нежелательному поведению. Ленивая загрузка Ленивая загрузка (lazy loading) означает, что вы загружаете синглтон только тогда, когда он вам нужен. Иными словами, вы инициируете экземпляр только при вызове getInstance(). То есть, даже если у вас есть другие статические методы в вашем классе Singleton, которые будут, например, загружать конфигурацию, и эти методы используются для запуска вашего приложения, то процесс инициализации все равно ограничен только методом getInstance(). Таким образом, время запуска вашего приложения не будет зависеть от времени загрузки экземпляра. Ленивая загрузка в классическом синглтоне Ленивая загрузка обычно используется в классическом синглтоне. Давайте сначала рассмотрим классический класс Singleton, который используется в однопоточном приложении. Это простой класс, который можно реализовать там, где у нас есть приватный конструктор, и мы можем вызвать getInstance() для инициализации переменной, если она по-прежнему имеет значение null. Результат должен выглядеть так: public class Singleton { private static Singleton instance; private Singleton() { } public static Singleton getInstance() { if(instance == null){ instance = new Singleton(); } return instance; } } Синхронизированная отложенная загрузка Синхронизация может быть немного сложной, поскольку здесь мы можем использовать два разных подхода: 1. Синхронизируем весь метод getInstance(). 2. Синхронизируем часть метода. Давайте реализуем код: public class ThreadSafeSingleton { private static ThreadSafeSingleton instance; private ThreadSafeSingleton() { } public static synchronized ThreadSafeSingleton getInstance() { if(instance == null){ Main.waitTime(); Main.waitTime(); instance = new ThreadSafeSingleton(); } Main.waitTime(); return instance; } public static ThreadSafeSingleton getInstanceOptimized() { if(instance == null){ synchronized (ThreadSafeSingleton.class){ if(instance == null){ Main.waitTime(); Main.waitTime(); instance = new ThreadSafeSingleton(); } } } Main.waitTime(); return instance; } } ▪Читать дальше @javarush