このトピックに基づいて、実装がAtomicIntegersに基づいているシングルトンパターンの興味深いバージョンを作成しました。
質問は次のとおりです。
- この実装は正しく、スレッドセーフですか。一般に、スレッドの同期と管理にアトミック変数を使用することは可能ですか。
volatile
追加の質問:この実装がスレッドセーフである場合、インスタンス変数の修飾子が本当に必要ですか?
public class StrangeSingleton
{
private StrangeSingleton() {};
private static volatile Object instance;
private static AtomicInteger initCounter = new AtomicInteger();
private static AtomicInteger readyCounter = new AtomicInteger();
static Object getInstance()
{
if (initCounter.incrementAndGet() == 1)
{
instance = new Object();
readyCounter.incrementAndGet();
return instance;
}
else if (readyCounter.get() == 1)
{
return instance;
}
else
{
//initialization not complete yet.
//write here some logic you want:
//sleep for 5s and try one more time,
//or throw Exception, or return null..
return null;
}
}
}
更新:プライベートコンストラクターを追加しましたが、それは重要ではありません。