設計モード――(単例モード)
8527 ワード
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
記述:この方式は比較的よく使われているが、ゴミ対象を生成しやすい.利点:ロックが付いていないと、実行効率が向上します.欠点:クラスがロードされると初期化され、メモリが浪費されます.public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
記述:この方式は最も基本的な実現方式であり、この実現の最大の問題はマルチスレッドをサポートしないことである.synchronizedはロックされていないため、厳密には単一のモードではありません.この方式lazy loadingは明らかで,スレッドの安全を要求せず,マルチスレッドでは正常に動作しない.コンカレントが発生すると、複数のインスタンスが作成されます.-スレッドセキュリティpublic class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
は、マルチスレッドで良好に動作するlazy loadingを備えているが、効率が低く、99%の場合同期を必要としないと説明している.利点:メモリの無駄を回避するために、最初の呼び出しで初期化されます.欠点:synchronizedをロックする必要がありますが、ロックは効率に影響します.public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
//
if (singleton == null) {
// , ,
synchronized (Singleton.class) {
// 。
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
は、この方法はデュアルロックメカニズムを採用し、安全であり、マルチスレッドの場合に高性能を維持することができると説明している.経験談:一般的には、第2種と第3種の怠け者方式は推奨されず、第1種の餓漢方式が推奨されている.他に特別なニーズがある場合は、第4のデュアルロック方式を使用することが考えられる.