シングルトン:
- つまり、オブジェクトの生産のためのライフサイクルは常に、決して変更され全体で、あります。
- クラスのインスタンスを1つだけ確実にし、それをアクセスするためのグローバルアクセスポイントを提供します。
役割:
- スレッドセーフな要件の場合は、スレッドの安全性のクラスのインスタンスの一意性を確保します。
- ときは、クラスのインスタンスの結束を確保するために、複数のインスタンスの存在を必要としません。メモリを無駄にしないでください。
特長:
- パブリックインスタンスを得る方法、
- プライベートコンストラクタ、
- プライベートメンバ変数。
Aは、式を飢え
* @description単一の実施形態飢え
キーシングルトン*飢え単一の実施形態は、クラス変数として直接得られ、初期化、すなわち、Aクラスのすべての変数が初期化される
シングルトンクラス変数初期化処理として、*同期百パーセントを確保することができる<clinit>()メソッドに回収される
*が、それは遅延ロードされていないため、ロードされた後シングルトンは、長い時間であってもよいが使用されていない、すなわち、オープンスペースの例は長く存在します時間は
*複数のスレッドの唯一のインスタンスを達成することができますが、できない怠惰が。
パッケージcom.liruilong.singleton; / ** * @author:Liruilong * @date:2019年7月20日夜05時55分 * / // 決勝を継承することを許可 パブリック 最終 クラスをシングルトン{ // インスタンス変数 プライベート バイト []ベイト= 新しい新しい バイト [1024 ]; // プライベートコンストラクタ、外部の新しい新許可しない プライベートシングルトン(){} プライベート 静的 最終シングルトンsingleton1 = 新しい新しいシングルトン(); 公共の 静的 シングルトンgetInstance1(){ 戻りsingleton1を; }
第二に、怠惰なスタイル
* @description怠惰な人間シングルトン
*遅延読み込みを保証することができますが、スレッドセーフではありません
* 2のスレッドへのアクセスがある場合、一つのケースの一意性を保証するものではありません
パッケージcom.liruilong.singleton; / ** * @author:Liruilong * @date:2019年7月20日夜05時55分 * / // 決勝を継承することを許可 パブリック 最終 クラスをシングルトン{ // インスタンス変数 プライベート バイト []ベイト= 新しい新しい バイト [1024 ]; // プライベートコンストラクタ、外部の新しい新許可しない プライベートシングルトン(){} プライベート 静的 シングルトンシングルトン= NULLを、
パブリック 静的 シングルトンのgetInstance(){ IF(シングルトン== NULL ){ シングルトン= 新しいシングルトン()。 } 戻りシングルトン。 }
第三に、追加の同期方法怠惰式
* + @description怠惰式同期方法シングルトン
遅延読み込みを保証することができ、そしてシングルトンインスタンスの一意性を保証することができますが、* synchronizeed排他的なキーワードでの結果
と同様の方法で* getInstance0()することができますのみ時間は、スレッドへのアクセスです。パフォーマンスが低下。
パッケージcom.liruilong.singleton; / ** * @author:Liruilong * @date:2019年7月20日17:55 * / // 決勝を継承することを許可 パブリック 最終 クラスをシングルトン{ // インスタンス変数 プライベート バイト []ベイト= 新しい新しい バイト [1024 ]; // 外部の新しい新許可しないプライベートコンストラクタ、 プライベートシングルトン(){} プライベート 静的 シングルトンシングルトン= NULL ;
パブリック 静的 同期シングルトンgetInstance0(){ IF(シングルトン== NULL){ シングルトン = 新しいシングルトン(); } 戻りシングルトン。 }
第四に、有効性シングルトンダブルロック
* +揮発性@descriptionダブルチェック単一のロック例(ダブルチェック)
*怠惰のために-そこには二つのスレッドシングルトンがnullで発見された改良型の同期方法、一つだけのスレッドが同期にアクセスすることができますでブロックします。
*遅延ロードが満たされ、スレッドの一意性を保証する
意志なし*欠点を、時にはNPE、(JVM実行コマンド並べ替え)報告することができる
取得するオブジェクト未完成の他のスレッドをインスタンス化することができる変数の*例シングルトン変数へ。
*初期化未完のインスタンスは、そのメソッドがnullポインタ例外がスローされます呼び出します。
パッケージcom.liruilong.singleton; / ** * @author:Liruilong * @date:2019年7月20日夜05時55分 * / // 決勝を継承することを許可 パブリック 最終 クラスをシングルトン{ // インスタンス変数 プライベート バイト []ベイト= 新しい新しい バイト [1024 ]; // プライベートコンストラクタ、許可していない外部の新しい新しい プライベートシングルトン(){} プライベート 静的 揮発性シングルトンsingleton2 = NULL ;
公共の 静的シングルトンgetInstance4(){ IF(singleton2 == NULL ){ 同期(シングルトンクラス){ 場合(singleton2 == NULL ){ singleton2 = 新しいシングルトン()。 } } } 戻りsingleton2。 }
第五に、単一の静的内部クラスの例は、
* @description静的内部クラスシングルトン
*シングルトンインスタンスがシングルトンクラスの初期化を作成しない、静的な内部クラスのシングルトンインスタンスを定義します。
*静的クラスを作成するためにアクティブがシングルトンの静的変数、最高のシングルトンの1内に作成されます
package com.liruilong.singleton; /** * @Author: Liruilong * @Date: 2019/7/20 17:55 */ // final 不允许被继承 public final class Singleton { // 实例变量 private byte[] bate = new byte[1024]; // 私有的构造函数,即不允许外部 new private Singleton(){ } private static class Singtetons{
private static Singleton SINGLETON = new Singleton(); /* static { final Singleton SINGLETON = new Singleton(); }*/ } public static Singleton getInstance2(){ return Singtetons.SINGLETON; }
六,枚举类单例
* @Description 基于枚举类线程安全
* 枚举类型不允许被继承,同样线程安全的,且只能被实例化一次。
package com.liruilong.singleton; /** * @Author: Liruilong * @Date: 2019/7/20 17:55 */ // final 不允许被继承 public final class Singleton { // 实例变量 private byte[] bate = new byte[1024]; // 私有的构造函数,即不允许外部 new private Singleton(){ } private enum Singtetonss { SINGTETONSS; //实例必须第一行,默认 public final static修饰 private Singleton singleton; Singtetonss() { //构造器。默认私有 this.singleton = new Singleton(); } public static Singleton getInstance() { return SINGTETONSS.singleton; } } public static Singleton getInstance3(){ return Singtetonss.getInstance(); }
原本是我笔记里的,摘了出来,面试的时候看,
更多见 ----》《Java并发编程详解》读书笔记