シングルトン
シングルトンデザインパターン入門
、クラスと呼ばれるシングルトンデザインパターンは、クラスのために、全ソフトウェアシステムを確実にするために特定の方法を取ることである唯一のオブジェクトインスタンスが存在し、そしてクラスは、そのオブジェクトのインスタンスを取得する唯一の方法(静的メソッド)を提供します。
このようなようにHibernate のSessionFactoryのは、プロキシデータ貯蔵源として機能し、作成するための責任があるSessionオブジェクトを。SessionFactoryの軽量ではないが、通常の状況下では、プロジェクトは通常のみのSessionFactoryを必要十分で、これはシングルトンに使用されますされています。
シングルトンデザインパターン8通り
1)式(静的定数)飢え
2)飢餓式(静的コードブロック)
3)怠惰な人間の(スレッドセーフ)
4)怠惰な人間の(スレッドセーフ、同期方法)
5)レイジー式(スレッドセーフ、同期ブロック)
6)ダブルチェック
7)静的内部クラス
8)列挙
空腹の男のタイプ(静的定数)
空腹の人型(静的定数)適用例
次のステップ:
1)コンストラクタ民営()新しい防止
内部2)オブジェクトを作成するためのクラス
3)外向きパブリック静的メソッドを露出させます。getInstance
4)コードの実装
SingletonTest01.java
package com.atguigu.singleton.type1;
public class SingletonTest01 {
public static void main(String[] args) {
//测试
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2); // true
System.out.println("instance.hashCode=" + instance.hashCode());
System.out.println("instance2.hashCode=" + instance2.hashCode());
}
}
//饿汉式(静态变量)
class Singleton {
//1. 构造器私有化, 外部不能new
private Singleton() {
}
//2.本类内部创建对象实例
private final static Singleton instance = new Singleton();
//3. 提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
長所と短所を説明します:
1)利点:このようなアプローチは、である、比較的単純で負荷がクラスがインスタンス化された完了したとき。スレッドの同期の問題を避けてください。
2)デメリット:ロードは、クラスのインスタンス化を完了すると、到達しなかった遅延ロードの効果を。あなたが最初から最後まで、この例を使用したことがない場合は、メモリの無駄になります
3)このようにclassloder機構に基づいて同期の問題マルチスレッドを回避する、しかし、インスタンスクラスのインスタンスに一度にロードされ、ほとんどの場合、単一モードでのgetInstanceを呼び出している方法、が、なぜクラスローディング、いくつかの理由がありますしたがって、クラスローダ原因他の方法(または他の静的メソッド)を決定することができない、それは遅延ローディング効果初期化インスタンスに到達しません
4)結論:このシングルトン利用可能な、できる無駄なメモリをもたらします
飢餓式(静的コードブロック)
SingletonTest02.java
package com.atguigu.singleton.type2;
public class SingletonTest02 {
public static void main(String[] args) {
//测试
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2); // true
System.out.println("instance.hashCode=" + instance.hashCode());
System.out.println("instance2.hashCode=" + instance2.hashCode());
}
}
//饿汉式(静态代码块)
class Singleton {
//1. 构造器私有化, 外部不能new
private Singleton() {
}
//2.本类内部创建对象实例
private static Singleton instance;
static { // 在静态代码块中,创建单例对象
instance = new Singleton();
}
//3. 提供一个公有的静态方法,返回实例对象
public static Singleton getInstance() {
return instance;
}
}
長所と短所を説明します:
1)このように上記実施の形態では、実際には非常に類似している、ことを除いて静的コードブロックにクラスインスタンス化プロセスを、だけでなく、クラスのロード時に静的コードブロック、クラスの初期化インスタンス上のコードが実行されます。長所と短所と上記と同じです。
2)結論:シングルこの実施の形態を使用することができるが、無駄なメモリをもたらすことができます
怠惰な人間の(スレッドセーフ)
SingletonTest03.java
package com.atguigu.singleton.type3;
public class SingletonTest03 {
public static void main(String[] args) {
System.out.println("懒汉式1 , 线程不安全~");
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2); // true
System.out.println("instance.hashCode=" + instance.hashCode());
System.out.println("instance2.hashCode=" + instance2.hashCode());
}
}
class Singleton {
private static Singleton instance;
private Singleton() {}
//提供一个静态的公有方法,当使用到该方法时,才去创建 instance
//即懒汉式
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
長所と短所を説明します:
1) 果たしている遅延ロードの効果が、単一のスレッドで使用することができます。
2) マルチスレッドにする場合は、この文を分析ダウン実行するための時間を持っていた文ブロックを分析するだけでなく、別のスレッドによってIF(シングルトン== NULL)へのスレッドは、時間インスタンスを複数生成します。だから、マルチスレッド環境でこのように使用することはできません
3)結論:実際の開発では、このアプローチを使用していません
レイジー男の(スレッドセーフ、同期方法)
SingletonTest04.java
package com.atguigu.singleton.type4;
public class SingletonTest04 {
public static void main(String[] args) {
System.out.println("懒汉式2 , 线程安全~");
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2); // true
System.out.println("instance.hashCode=" + instance.hashCode());
System.out.println("instance2.hashCode=" + instance2.hashCode());
}
}
// 懒汉式(线程安全,同步方法)
class Singleton {
private static Singleton instance;
private Singleton() {}
//提供一个静态的公有方法,加入同步处理的代码,解决线程安全问题
//即懒汉式
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
長所と短所を説明します:
1)不安スレッドの問題を解決するために
2)効率が低すぎると、各スレッドが実行されたときにクラスインスタンスを取得したいのgetInstance()メソッドは、同期されなければなりません。そして、実際には、コードだけのインスタンスに一度、この方法で十分です、私はインスタンスのこの種の、直接のリターンの後ろに取得したい行に。同期させるために非効率的な方法
3)結論:実際の開発では、このように推奨されていません