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 остаётся в силе.