誰もがシングルトンモデルにすでに精通しており、その実装方法は通常、次の2つのタイプに分割されていると思います。
コードコピーは次のとおりです。
//怠zyな実装
パブリッククラスシングルトン{
プライベート静的シングルトンインスタンス= null;
privatesingleton(){}
public static newinstance(){
if(null == instance){
instance = new Singleton();
}
インスタンスを返す;
}
public void dosomething(){
//何かをする...
}
}
//空腹の中国スタイル
パブリッククラスシングルトン{
Private Static Singleton Instance = new Singleton();
privatesingleton(){}
public static singleton newinstance(){
インスタンスを返す;
}
public void dosomething(){
//何かをする...
}
}
シングルインテストモードの使用では、怠惰で空腹のスタイルは異なるアプリケーションシナリオを持っています。プロジェクトが開始されたときにのみ使用します。
上記の2つのモードでは、Multi-Threadedの場合、JVMは一度だけ単一の利息クラスをロードするため、The Hungry Manスタイルに問題はありませんが、Lazy Manスタイルは繰り返し単一の関心を生み出す問題を抱えている可能性があります。オブジェクト、つまりスレッドが安全ではないということです。
それでは、空腹のマンスタイルのスレッドセーフの単一の金持ちモードを作成する方法はありますか?確かに、人々はそれを実装するために同期ロックを追加する方法を使用しますが、これを実装するためにより厄介です。多くの場合、JVMは次のような同期制御を提供してくれました。
a
b最終フィールドにアクセスするとき。
JVMがクラスをロードしている場合、データが同期することを保証します。
クラスレベルの内部クラスを使用して、この内部クラスでオブジェクトインスタンスを作成します。このようにして、クラスレベルの内部クラスを使用しない限り、オブジェクトインスタンスを作成することはなく、怠zyな怠zyなロードとスレッドの安全性を実現します。
コードコピーは次のとおりです。
パブリッククラスシングルトン{
//インナークラス、単純な関心オブジェクトは、内部クラスがロードされている場合にのみ作成されます
プライベート静的クラスのシングルトンホルダー{
public static singleton instance = new Singleton();
}
privatesingleton(){}
public static singleton newinstance(){
singletonholder.instanceを返します。
}
public void dosomething(){
//何かをします
}
}
これにより、スレッドセーフシングルプライスモデルが実現できます。
さらに、列挙タイプを介して単一の金銭モードを実装することもできます。これは、より推奨される方法でもあります。
列挙タイプを使用してシングルトンパターンを実装することは次のとおりです。
コードコピーは次のとおりです。
Public Enum Singleton {
//列挙された要素を定義する、それはシングルトンのインスタンスです
実例;
public void dosomething(){
//何かをする...
}
}
OK、Singletonモードはここに紹介されています。