Что такое double checked locking Singleton
double checked locking Singleton - это один из способов создания потокобезопасного класса реализующего шаблон Одиночка. Данный метод пытается оптимизировать производительность, блокируясь только в случае, когда экземпляр одиночки создаётся впервые.
class DoubleCheckedLockingSingleton {
private static volatile DoubleCheckedLockingSingleton instance;
static DoubleCheckedLockingSingleton getInstance() {
DoubleCheckedLockingSingleton current = instance;
if (current == null) {
synchronized (DoubleCheckedLockingSingleton.class) {
current = instance;
if (current == null) {
instance = current = new DoubleCheckedLockingSingleton();
}
}
}
return current;
}
}
Следует заметить, что требование volatile
обязательно. Проблема Double Checked Lock заключается в модели памяти Java, точнее в порядке создания объектов, когда возможна ситуация, при которой другой поток может получить и начать использовать (на основании условия, что указатель не нулевой) не полностью сконструированный объект. Хотя эта проблема была частично решена в JDK 1.5, однако рекомендация использовать volatile
для Double Cheсked Lock остаётся в силе.
Oct. 21, 2023, Источник