JAVA単例モード6種表記(反射破壊単例付)

5132 ワード

JAvaでは単例モードはよく見られる設計モードであり、単例モードの書き方は多種あり、ここでは主に6種類の書き方を紹介する:餓漢式単例、怠け者式単例3個、静的内部類、列挙.シングル・インスタンス・モードには、1、シングル・インスタンス・クラスに1つのインスタンスしかないという特徴があります.2、単一のインスタンスクラスは、独自の一意のインスタンスを作成する必要があります.3、単一のクラスは、他のすべてのオブジェクトにこのインスタンスを提供する必要があります.
一.単例書き方<1>餓漢式単例
//      .            
public class Singleton {  
    private Singleton() {}  
    private static final Singleton single = new Singleton();  
    //         
    public static Singleton getInstance() {  
        return single;  
    }  
}  

この方式はクラスロード時にインスタンスを初期化し,怠け者ロードの効果は得られなかったが,スレッドが安全な<2>怠け者式1である.
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  

    public static Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}  

怠惰なロードを実現し、スレッドの安全な<3>怠惰な2(同期方法)ではありません.
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
    if (instance == null) {  
        instance = new Singleton();  
    }  
    return instance;  
    }  
}  

同期メソッド形式を使用すると、リロードとスレッドのセキュリティが実現されますが、効率が低く、同期を必要としない場合が多いです.<4>怠惰ロード3(ダブルチェックロック)
public class Singleton {  
    private static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}  

怠惰なロードを実現し、スレッドが安全で、効率と同期方法の形式が<5>静的内部クラスを向上させる
public class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}  

これは怠け者の形式よりも優れており、スレッドのセキュリティを実現し、同期によるパフォーマンスの影響を回避します.<6>列挙形式
public enum Singleton {  
    INSTANCE;  
    //    ,     INSTANCE.   
    public void whateverMethod() {  
    }  
}  

コードが少なく、スレッドのセキュリティを実現し、反射による単一モードの破壊を回避できます.
まとめ:もう一つの登録式の単例があり、後で勉強します.怠惰なロード要求があれば餓漢式を使うことができます.スレッドのセキュアなリロードは静的内部クラスを使用し、逆シーケンス化によるオブジェクトの作成に列挙を使用します.熟練した列挙を使用するのが良い選択であれば、コードは簡単です.
二.java反射破壊の一例:http://blog.csdn.net/lws332969674/article/details/8125893 このリンクを参照して、一意の単一のインスタンスが検証されることを保証できるかどうか.
備考:リンクで単例コードフラグビットflag設定の破壊を防止する問題;