レイジー式(スレッドセーフ、同期ブロック)応用例
長所と短所を説明します:
1)このように、低効率、インスタンス化された同期コードブロックを生成するため、第四、フロント同期方法の実装を改善することを意図しました
2)しかし、この同期は、スレッド同期の役割を果たしていません。最初と3 状況の一貫した実装種類が遭遇したスレッドがあれば(シングルトン== nullの)入力した場合、判定文ブロックではなく、ダウンを実行するのに十分な時間を、別のスレッドでも裁判官の判決を渡され、この時間が生成されます複数のインスタンス
3)結論:で実際の開発、使用することができない、このように
ダブルチェック
SingletonTest06.java
package com.atguigu.singleton.type6;
public class SingletonTest06 {
public static void main(String[] args) {
System.out.println("双重检查");
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 volatile Singleton instance;
private Singleton() {}
//提供一个静态的公有方法,加入双重检查代码,解决线程安全问题, 同时解决懒加载问题
//同时保证了效率, 推荐使用
public static synchronized Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
長所と短所を説明します:
1)ダブルチェックインのコンセプトは、あるマルチスレッド開発しばしば使用したセキュリティスレッドを確保するように、コードに示すように、我々は2つ(シングルトン== null)の検査であれば実施しました。
2)このように、インスタンス化コードは一度だけ使用され、後に再びアクセスしたとき(シングルトン== NULL)場合、それは、判断され
オブジェクトの直接リターンの例として、だけでなく、繰り返し同期方法を避けるために。
3)スレッドセーフ;遅延読み込み、高効率
4)結論:実際の開発では、これは、設計パターンシングルトン推奨されます
静的な内部クラス
SingletonTest07.java
package com.atguigu.singleton.type7;
public class SingletonTest07 {
public static void main(String[] args) {
System.out.println("使用静态内部类完成单例模式");
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 Singleton() {}
//写一个静态内部类,该类中有一个静态属性 Singleton
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
//提供一个静态的公有方法,直接返回SingletonInstance.INSTANCE
public static synchronized Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
長所と短所を説明します:
1)このメソッドは、使用するクラスローディングつのみのスレッド・インスタンスの初期化を確実にするためのメカニズムを。
2)内部の静的型ようにシングルトンクラスがロードされていないすぐにインスタンス化されるが、必要なときにインスタンス化されたコールのgetInstanceの方法がロードされSingletonInstanceのそれによって完成、クラスをシングルトンはインスタンス化。
3)クラスの静的プロパティは、最初のクラスが初期化されている場合にのみロードされているので、ここでは、JVMのクラスが初期化されるとき、他のスレッドがアクセス不能で、セキュリティスレッドを確保するために。
4)利点:回避スレッドセーフを使用し、静的内部クラスは、遅延ローディング、高効率を実現する機能します
5)結論:推奨。
列挙
SingletonTest08.java
package com.atguigu.singleton.type8;
public class SingletonTest08 {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
Singleton instance2 = Singleton.INSTANCE;
System.out.println(instance == instance2);
System.out.println(instance.hashCode());
System.out.println(instance2.hashCode());
instance.sayOK();
}
}
//使用枚举,可以实现单例, 推荐
enum Singleton {
INSTANCE; //属性
public void sayOK() {
System.out.println("ok~");
}
}
長所と短所を説明します:
1)この手段JDK1.5の列挙は、シングルモードの実施形態を実現するために添加しました。だけでなく、マルチスレッド同期の問題を回避するには、だけでなく、ためにデシリアライズ新しいオブジェクトを再作成して防ぎます。
2)このアプローチは、効果的なのJava 著者ジョシュ・ブロッホ提唱方法
3)結論:推奨