Singleton - это паттерн проектирования, который гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. В Java Singleton может быть реализован с использованием приватного конструктора, статического метода и статической переменной.
Пример Singleton с ленивой загрузкой Вот пример реализации Singleton с ленивой загрузкой в Java:
public class Singleton {
private static Singleton instance;
private Singleton() {
// приватный конструктор }
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
В этом примере переменная instance инициализируется только при первом вызове метода getInstance(). Это позволяет отложить создание объекта Singleton до момента его реального использования.
Потокобезопасность Singleton
Однако, приведенная выше реализация Singleton с ленивой загрузкой не является потокобезопасной. Если несколько потоков одновременно вызывают метод getInstance() до того, как instance будет инициализирован, то может произойти создание нескольких экземпляров Singleton.
Для обеспечения потокобезопасности можно использовать различные подходы, например:
Synchronized метод: Можно сделать метод getInstance() синхронизированным, чтобы гарантировать, что только один поток может выполнить его в определенный момент времени. Однако, это может привести к снижению производительности в многопоточной среде.
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
Double-Checked Locking: Другой подход - использовать "Double-Checked Locking" для уменьшения накладных расходов на синхронизацию. В этом случае сначала проверяется значение instance без синхронизации, а затем, если значение instance все еще равно null, выполняется синхронизированный блок для создания экземпляра.
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
Когда ленивая загрузка хуже?
Ленивая загрузка может быть полезной, когда создание объекта Singleton требует больших ресурсов или занимает много времени. Однако, она может быть менее подходящей, когда требуется гарантированная потокобезопасность или когда объект Singleton должен быть создан немедленно.
Если вам понравилось, буду признателен за подписку.