Здесь у нас есть synchronized
запись и non-synchronized
чтение.У нас нет никакой гарантии, что чтение получит значение, установленное записью.Так что этот код глючит.Но это очень тонкая ошибка, особенно в многоядерных процессорах.
Если вам по какой-то причине нужно продолжить работу с приведенным выше кодом, одно из решений - объявить переменную как volatile
следующим образом:
private static volatile MySingleton mySingleton;
Или сделать чтениепеременная synchronized
.Любой из них решит вашу проблему за счет производительности.
Еще одним важным моментом является то, что ваша переменная temp
здесь не используется.Это просто избыточный код и ничего не делает.Вместо этого непосредственно присвойте ее переменной mySingleton
следующим образом:
mySingleton = new MySingleton();
Все вышеперечисленные проблемы можно легко решить, используя тип enum
для создания синглетонов.Поскольку перечисления изначально Serializable
, нам не нужно реализовывать их с помощью интерфейса Serializable
.Проблема отражения также не существует.Поэтому на 100% гарантируется, что в JVM присутствует только один экземпляр Singleton
.Таким образом, этот метод рекомендуется как лучший метод создания синглетонов в Java.