Ваш код правильный. Чтобы избежать загрузки более одного раза, synchronized{}
было бы неплохо.
Вы можете удалить volatile
, если Dictionary
является неизменным.
private Dictionary dict; // not volatile; assume Dictionary immutable
public Dictionary getDict()
if(dict==null)
dict = load()
return dict;
Если мы добавим двойную проверку блокировки, это прекрасно
public Dictionary getDict()
if(dict==null)
synchronized(this)
if(dict==null)
dict = load()
return dict;
Двойная проверка блокировки отлично подходит для неизменяемых объектов, без необходимости использования энергозависимых.
К сожалению, описанные выше методы 2 getDict()
не являются теоретически пуленепробиваемыми. Слабая модель памяти Java допускает некоторые пугающие действия - в теории. Чтобы книга была на 100% правильной, мы должны добавить локальную переменную, которая загромождает наш код:
public Dictionary getDict()
Dictionary local = dict;
if(local==null)
synchronized(this)
local = dict;
if(local==null)
local = dict = load()
return local;