Существует несколько способов создания потокобезопасного Singleton:
Eager Initialization (ранняя инициализация):
java
Простой и потокобезопасный, но объект создается даже если не будет использован.
Lazy Initialization (отложенная инициализация) с использованием synchronized method:
java
Безопасно, но может быть неэффективно из-за избыточной синхронизации при каждом вызове.
Lazy Initialization с использованием Double Checked Locking:
java
Снижает избыточную синхронизацию. Использование volatile гарантирует корректную видимость инициализации объекта между потоками.
Using Enum:
java
Самый простой и надежный способ с точки зрения потокобезопасности и предотвращения проблем с десериализацией. Java гарантирует, что enum-константы инициализируются только один раз.