このインスタンス化方法について質問があります。
このウェブサイトから、次のように書かれています。
class Singleton
{
private static Singleton instance;
private Singleton()
{
System.out.println("Singleton(): Initializing Instance");
}
public static Singleton getInstance()
{
if (instance == null)
{
synchronized(Singleton.class)
{
if (instance == null)
{
System.out.println("getInstance(): First time getInstance was invoked!");
instance = new Singleton();
}
}
}
return instance;
}
public void doSomething()
{
System.out.println("doSomething(): Singleton does something!");
}
}
ただし、Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson による本「Head First Design Pattern」から、同じ方法を使用してシングルトンをインスタンス化しますが、唯一の違いは、プライベート静的メンバーを宣言し、volatile
それらをリムにすることです。それを宣言することについてのポイントはかなりvolatile
です。スレッド間の適切な「happnens-before 関係」を確立するために、同期された「クリティカル ゾーン」を宣言するだけでは十分ではないでしょうか?