JAVA設計モード学習ノート5——単例モード


シングル・インスタンス・モード:クラスにインスタンスが1つしかなく、グローバル・アクセス・ポイントが1つしかないことを確認します.
 
単例パターンは一般に怠け者式と悪漢式に分けられ,怠け者式は初めてクラスを取得したときにクラスのインスタンス化を行い,餓漢式はクラスがロードされたときに直接インスタンス化する.シングル・インスタンス・モードを定義する一般的な手順は、次のとおりです.
*このクラスが外部プログラムによってインスタンス化されないことを保証するために、プライベートな構造関数を定義します.*クラスのインスタンス変数を定義して、クラスの一意のインスタンスを保存します.*クラス固有のインスタンスを取得する静的メソッドを定義し、外部プログラムがクラス固有のインスタンスを取得できるようにします.
 
怠け者:
 
public class Singleton {
	private static Singleton uniqueInstance;
 
	private Singleton() {}
 
	public static synchronized Singleton getInstance() {
		if (uniqueInstance == null) {
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

synchronizedキーワードを使用してインスタンスの取得を保証する場合、インスタンスがnullの場合、インスタンスを作成するスレッドは1つしかありませんが、効率が低下し、より良い解決策があります.
 
スレッドの安全な怠け者:
 
 
public class Singleton {
	private volatile static Singleton uniqueInstance;

	private Singleton() {}

	public static Singleton getInstance() {
		if (uniqueInstance == null) {
			synchronized (Singleton.class) {
				if (uniqueInstance == null) {
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}

「二重チェックロック」を使用すると、getInstanceで同期の使用を減らすことができます.volatileキーワードは、uniqueInstance変数がSingletonインスタンスに初期化されると、複数のスレッドがuniqueInstance変数を正しく処理することを保証します.1.4以降のJavaでは、多くのJVMがvolatileキーワードを実装すると、二重ロックが無効になります.
 
 
餓漢式:
public class Singleton {
	private static Singleton uniqueInstance = new Singleton();
 
	private Singleton() {}
 
	public static Singleton getInstance() {
		return uniqueInstance;
	}
}

餓漢式はクラスがロードされると直接インスタンス化されるため,インスタンスを取得する際のスレッドセキュリティの問題は存在しない.