Мое намерение (а также понимание этого) заключается в том, что:
1) Когда поток вызывает getInstance, он атомарно увеличивается и проверяет, является ли его желаемое значение.
Да.
2) Если нет, он будет ждать, пока другой поток откроет защелку, что означает, что идет инициализация.
Да.
Сдается мне, что я, вероятно, могу просто сделать synchronized(someLockObject) {}
блок
Да, и это было бы более типично.
Мне было интересно, еслиэто вообще имеет смысл.
Код будет работать так, как вы, похоже, намереваетесь, если только getInstance()
не будет вызываться достаточно раз для initialized
, чтобы вернуться к 0. Я был бы склонен коднако вместо этого используйте AtomicBoolean
и его метод compareAndSet()
, так как это, кажется, лучше моделирует ситуацию (и это не представляет никакого риска для любой ситуации).
Я был бы более склонен использовать синхронизацию, однакоДо тех пор, пока это не привело к неразрешимой проблеме производительности.Это яснее и доступнее.
Но в целом подход кажется плохо продуманным, поскольку поток, который вызывает getInstance()
с одним набором аргументов, может получить экземпляр, который был инициализирован с другим набором параметров.Это может быть признаком того, что вместо этого варианта шаблона Singleton вам лучше использовать шаблон «просто используйте один».В частности, обратите внимание, что некоторые люди считают синглтон анти паттерном .