ディレクトリ
序文
シングルトンのようなものを書くの普及のオンライン増殖は、7種類があると言うが、また6種類が、もちろん、ルールは5を話すしない、彼らは間違っていると述べたことを言いましたか?実際には、自然の本質と広く一致している権利と間違って、好奇心旺盛、すべての後、書き込みは書き込みがあるが、ありません!だから、絶対に同様カエルをキャッチし、宜春市ヘッドホンを盗むためにインターネットカフェに行くが続くかもしれない方法文言の多く、今回調査する必要がフィールドに行くようになったん、一日一日....
身近に... Singletonパターンはないなじみのない最も一般的に使用されるデザインパターン、デザインパターンSingletonパターンの身近な友人の一人です。一方、シングルトンデザインパターンは比較的単純で理解しやすいです。
@
Singletonパターンとは何ですか?
用語集
Singletonパターンは、単一の実施形態のクラスは、オブジェクトのインスタンスが1つだけ存在することができように定義される一般的なデザインパターンです。何度もシステム全体が唯一のグローバルオブジェクトを持っている必要があり、これは、私たちはシステムの全体的な動作を調整するのに役立ちます。シングルトンオブジェクトを介して再取得サービス構成情報の過程において、例えば、サーバプログラムは、サーバ構成情報は、ファイルに格納されたコンフィギュレーションデータは、シングルトンオブジェクトの結束によって読み取られ、その後、他のオブジェクト。このアプローチは、複雑な環境における構成管理を簡素化します。
シングルトンは、単にクラスのインスタンスを1つだけを意味し、このインスタンスは、プロジェクト全体にアクセスすることができます。
Singletonパターンの利点
1、メモリ空間の保存メモリ内の1つのオブジェクトのみ、。
2、回避は、パフォーマンスを向上させることができ、破壊オブジェクトを作成して頻繁に。
3、共有リソースの複数の占領を避けるために。
4、グローバルにアクセス可能。
全体的なアイデアのプロセスを達成するためにSingletonパターン
まず、Singletonパターンは、クラスのメソッドが返すオブジェクト参照(常に同じ)とを持つことができることが必要ですクリアする必要があり(多くの場合、使用される静的メソッドでなければなりませんインスタンスを取得しgetInstance
、この名前を)。
従来の思考シングルトンは、実質的に以下の3つのステップと同じ達成します:
1、プライベートコンストラクタ
2、彼らのプライベート静的参照例を指し
3、パブリック静的メソッドは、それらの値の例を返しますもちろん、それはとして理解することができる
外部の新しいを任せることはできない工事の民営化方法。
2、[場合ローディング内部静的変数は、クラスのオブジェクトのインスタンスを作成するために、このクラスのオブジェクトのインスタンスを作成するために
、図3(通常法を用い静的パブリック静的メソッドを提供する、のgetInstanceの名前)を、オブジェクトのインスタンスを返します。
このクラスのコンストラクタは、プライベートメソッドとして定義されるので、コードが唯一のクラスの静的メソッドを提供することによって得られたクラスの一意のインスタンスに、クラスのコンストラクタを呼び出すことにより、他のインスタンス化されたクラスのオブジェクトでないことである;
で我々は、このメソッドを呼び出すとクラスは、この基準への参照が返される空の保留がない場合、クラス参照は、クラスのインスタンスを作成する場合、空の保持及びクラス与えられた例を挙げて、クラス内の静的メソッドを提供します参考文献を開催しました。
シングルトンパターンのアプリケーションシナリオ
シングルモードの実施形態は、多くのユニークな利点を持っているので、プログラミングで使用されるデザインパターンの詳細です。私はシングルトンパターンを使用してシーンに知っていることまとめ:
図1は、そのオブジェクトと破壊頻繁にインスタンス化を必要とします。
2、あなたはあまりにも時間がかかりすぎたり、多くのリソースを消費しますが、頻繁にオブジェクトを使用するオブジェクトを作成するとき。
3、オブジェクトの状態のツールがあります。
図4は、頻繁にアクセスされるデータベースやファイルオブジェクト。
私は空腹の男、単一の例ですが、JDKを使用するクラスランタイムの裏にについて話をされます!デフォルトモードの実施形態の単一のフレームではSpring MVCのコントローラ!
8つの書き込みジェスチャーシングルトン
宜春市を強くすることをお勧めします。シングルトンの読者や友人とのご連絡がない場合、強く、あなたが再び手をノックをお勧めします、そうでなければ何の効果もコピーしないでください!
もう一つのポイントは、本当にシングルトンパターンを理解するのは簡単、JVMクラスローダーの知識を見逃すことができない、またはあなただけのレベルか、何をノックすることがありますか?クラスローダを理解していませんか?残りは宜春市はあなたに、あなたが徹底的に理解しておくべきである、安心しました。
[2]の記事資料では、JavaクラスとクラスローダJVMソースコード解析の深い理解をロードしてみましょう決して、気をつけてください
実際には、上記の記事は本当に戻って、この記事を参照して立つことができなかった理解していない、伊春の優しさを理解するために希望を理解していない、それを見て、自然を理解する上で、この記事の重要性を理解することが特に重要ですOK、大したことして、トイレのふたカバーにブロガーがまとめた....
暖かい心ではないですか?伊春には多くのビープ音、離れてからの直接のラインとヤード以上ではありません....
ジェスチャー:空腹の男のタイプ1(静的変数)
package singletonPattern;
//饿汉式(静态变量)
class Singleton{
//1、私有化构造方法,让外部不能new
private Singleton(){
}
//2、本类内部创建对象实例【静态变量目的是为了类加载的时候创建实例】
private final static Singleton instance=new Singleton();
//3、提供一个公有的static静态方法,返回实例对象
public static Singleton getInstance(){
return instance;
}
}
//以下是测试代码=====================
public class SingletenDemo1 {
public static void main(String[] args) {
Singleton singleton=Singleton.getInstance();
Singleton singleton2=Singleton.getInstance();
//验证一:
System.out.println(singleton==singleton2);
//验证二:
System.out.println(singleton.hashCode());
System.out.println(singleton2.hashCode());
}
}
//运行结果:
// true
// 460141958
// 460141958
/*
饿汉式(静态变量)方法
优点:写法简单,在类加载的时候就完成了实例化,同时也就避免了线程同步问题,因此线程安全
缺点:由于是在类加载时就完成了实例化,没有达到懒加载的效果。如果一直没有使用过这个实例,就造成了内存的浪费!
总结:这种方式基于ClassLoader类加载机制避免了多线程的同步问题,只不过instance属性在类加载就实例化,在单例模式中大多数都是调用getInstance方法,
由于getInstance方法是static静态的,调用它肯定会触发类加载!但是触发类加载的原因有很多,我们不能保证这个类会通过其他的方式触发类加载(比如调用了其他的static方法)
这个时候初始化instance就没有达到lazy loading 懒加载的效果,可能造成内存的浪费!
饿汉式(静态变量)这种方式可以使用但是会造成内存的浪费!
*/
態度II:飢餓式2(静的の静的コードブロック)
package singletonPattern;
//饿汉式2(static静态代码块)
class Singleton2{
private Singleton2(){
}
private static Singleton2 instance;
static{ //把创建单例对象的操作放进了static静态代码块中==============
instance = new Singleton2();
}
public static Singleton2 getInstance(){
return instance;
}
}
//饿汉式2(static静态代码块)其实和第一种饿汉式(静态变量)方法差不多,其优缺点一致!
//唯一不同的就是把创建单例对象的操作放进了static静态代码块中
態度3:怠惰なタイプ1(スレッドセーフ)
package singletonPattern;
//懒汉式1(线程不安全)
class Singleton3{
private Singleton3(){
}
private static Singleton3 instance;
public static Singleton3 getInstance(){
if(instance == null){
instance=new Singleton3();
}
return instance;
}
}
/*
懒汉式(线程不安全)的这种方式起到了懒加载的效果,但只能在单线程下使用。
如果在多线程下,一个线程进入了if(singleton==null)判断语句块,还没执行产生实例的句子,另一个线程
又进来了,这时会产生多个实例,所以不安全。
结语:懒汉式(线程不安全)在实际开发中,不要使用这种方式!!存在潜在危险
*/
態度4:怠惰な2型(スレッドセーフ)
package singletonPattern;
//懒汉式2(线程安全)
class Singleton4{
private Singleton4(){
}
private static Singleton4 instance;
public static synchronized Singleton4 getInstance(){
if(instance == null){
instance=new Singleton4();
}
return instance;
}
}
/*
懒汉式2(线程安全)方式
优点:线程安全
缺点:效率太低,每次调用getInstance方法都要进行同步
结语:懒汉式2(线程安全)方式在开发中不推荐使用,主要是效率太低了*/
姿勢5:飢餓式2(静的静的コードブロック)
package singletonPattern;
//懒汉式3 同步代码块(线程安全) 但是不满足单例,在多线程下依旧会有多个实例
class Singleton5{
private Singleton5(){
}
private static Singleton5 instance;
public static Singleton5 getInstance(){
if(instance == null){ //多线程情况下可能多个线程进入这个if块
synchronized (Singleton5.class){ //到这里只会一个一个创建实例,虽然安全,但是就不再是单例了
instance=new Singleton5();
}
}
return instance;
}
}
/*
懒汉式3 同步代码块(线程安全) 但是不满足单例,依旧会有多个实例
结语:懒汉式3 同步代码块(线程安全)方式在开发中不使用 ,实际上这个单例设计的有点搞笑*/
態度六:ダブルチェックシングル場合
package singletonPattern;
//双重检查应用实例方式
class Singleton6{
private Singleton6(){}
private static volatile Singleton6 singleton;
public static Singleton6 getInstance(){
if(singleton==null){
synchronized(Singleton6.class){
if(singleton == null){
singleton= new Singleton6();
}
}
}
return singleton;
}
}
/*
双重检查应用实例方式:
线程安全、延迟加载、效率较高
结语:开发中推荐使用!
*/
この時間ブロガーがわかりますいくつか、慎重に靴をビープする必要があるVolatile
キーワードを、完成し、見ていない、白い靴はパニック!
Volatile
変数は持ってsynchronized
視感度特性を、しかし特性原子を持っていません。この手段は、スレッドは自動的にvolatile変数の最新の値を発見することができていること。
この実装は、性能に大きな影響を引き起こすことなく、スレッドセーフな方法のインスタンスを作成するのいずれかで達成することができます。同期は、あなたがそれによって速度を高速化、同期を必要としていない場合にのみ、最初のインスタンスが作成されています。
態度7:静的な内部クラスのシングルトン
package singletonPattern;
//static静态内部类单例
class Singleton7{
private Singleton7(){}
private static volatile Singleton7 instance;
//写一个static静态内部类,给该类添加一个static静态instance属性
private static class SingletonInstance{
private static final Singleton7 SINGLETON_7=new Singleton7();
}
//
public static synchronized Singleton7 getInstence(){
return SingletonInstance.SINGLETON_7;
}
}
/*
静态内部类单例方式
1、这种方式采用了类加载机制来保证初始化实例时只有一个线程
2、巧妙的将实例化Singleton操作放进getInstance方法中,getInstance方法返回静态内部类中实例化好的Singleton
3、类的静态属性只会在第一次加载类的时候初始化,也就是只会初始化一次,在这里,JVM帮我们保证了线程的安全,类在初始化时,别的线程无法进入。
优点:线程安全、利用静态内部类特点实现延迟加载、效率高
开发中推荐使用这种静态内部类单例方式!
static静态内部特点:
1、外部类加载不会导致内部类加载,保证了其懒加载
*/
この単一の例では、伊春はビープ音2を持っているだろう、それは一つのケースは、クラスローダの外に、ある静的の静的内部特性は、内部クラスローダにつながらないことを理解することが必要であることを明確にします!
姿勢8:飢餓式2(静的の静的コードブロック)
package singletonPattern;
//使用枚举
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader;
enum Singleton8{
INSTANCE;
public void methodName(){
System.out.println("测试数据");
}
}
/*
枚举方式的枚举:
推荐写法,简单高效。充分利用枚举类的特性,只定义了一个实例,且枚举类是天然支持多线程的。
借助JDK1.5中添加的枚举来实现单例模式优点:
1、不仅能避免多线程同步问题
2、还能防止反序列化重新创建新的对象
枚举方式单例是由Effective java作者Josh Bloch提倡的,结语:推荐使用!
*/
もちろん、あなたがテストすることができます
public class SingletonDemo8 {
public static void main(String[] args) {
Singleton8 instance = Singleton8.INSTANCE;
Singleton8 instance2 = Singleton8.INSTANCE;
System.out.println(instance==instance2);
System.out.println(instance.hashCode());
System.out.println(instance2.hashCode());
instance.methodName();
}
}
結果:
true
460141958
460141958
测试数据
トゥルー何も間違っています!
単一ソースの実施形態のアプリケーションJDK
ランタイムそれのソースを見て、シングルトンのようなものを使用してそれを分析!
/**
* Every Java application has a single instance of class
* <code>Runtime</code> that allows the application to interface with
* the environment in which the application is running. The current
* runtime can be obtained from the <code>getRuntime</code> method.
* <p>
* An application cannot create its own instance of this class.
*
* @author unascribed
* @see java.lang.Runtime#getRuntime()
* @since JDK1.0
*/
public class Runtime {
private static Runtime currentRuntime = new Runtime();
/**
* Returns the runtime object associated with the current Java application.
* Most of the methods of class <code>Runtime</code> are instance
* methods and must be invoked with respect to the current runtime object.
*
* @return the <code>Runtime</code> object associated with the current
* Java application.
*/
public static Runtime getRuntime() {
return currentRuntime;
}
/** Don't let anyone else instantiate this class */
private Runtime() {}
これは、それを見るのは簡単でなければなりません!あなたが本当にシングルトンパターンを理解していないことをあなたが表示されない場合、唯一のショー、私は実際にはシングルトンパターンを言いたい、実際に簡単な23個のデザインパターンですが、ちょうどより多くの書き込み!同時に、インタビュアーは通常シングルトンを尋ね、それは非常に基本的である、と少しレベルを尋ね、使用がアップしているJDKであなたのシングルトンを依頼することですどうやら、それが使用するJDKランタイム実際には、単一の空腹男ですケース!コメントが言うように、すべてのJavaアプリケーションは、実行時インスタンスがあります。ランタイムシングルトンパターンを使用すると、クラスファイルをロードすると、この例が存在していることを意味し、飢えモードを使用して作成されます。
ランタイムクラスJVMは、システム情報を取得する、または機械を用いてもよいそのようなプログラムを実行する解放空間ジャンクのGC()メソッドを使用することができます。
== デフォルトスプリングMVCコントローラは、単一の実施の形態では、解像度があります。==
シングルトンの概要
図1は、このように飢えた男のタイプ(静的変数)を使用することができるが、遅延読み込み遅延ロードの効果を達成していないメモリの無駄が発生します!開発が推奨されていません。
図2に示すように、式(静的静的コードブロック)と、実際に第1の方法は、式(静的変数)飢えほぼ同じ利点と欠点を飢え!唯一の違いは、静的な動作コードブロックに静的オブジェクトの単一の実施形態を作成することである
3、レイジー式(スレッドセーフな)効果がなく、単一のスレッドで、遅延ロードを果たしました。実際の開発では、このように使用しないでください!!!
図4に示すように、遅延型2(スレッドセーフな)方法は、スレッドセーフが、低効率、getInstanceメソッドへの各呼び出しは、同期されなければなりません。これは、開発での使用は推奨されません。図5に示すように、遅延型3
同期コードブロック(スレッドセーフ)モードは、実際に、この設計はビット面白いハハであり、開発に使用されていません。
図6は、二重の一例として、セキュリティスレッド、遅延ロード、高い効率によって、アプリケーションをチェック。そのため、開発が推奨しました!
図7は、静的内部クラスを使用して、単一の静的内部クラスのスレッドセーフな方法は、遅延ロード特性、及び高効率を実現します。この開発は、静的な内部クラスのシングルトンの方法を使用することをお勧めします!
Singletonパターンを達成するために、追加の列挙JDK1.5とマルチスレッドの同期の問題がないだけを回避することができる8は、デシリアライゼーション新しいオブジェクトを再作成防止することができます。シングルトンはジョシュブロッホは、開発が推奨提唱効果的なJavaの著者を列挙するための方法です!
シングルトンは、すべての後に、今基本的にマルチコアサーバで、マルチスレッドアプリケーションでの使用に入れなければなりません。
この記事へのあなたの助けの少しがある場合、〜、聖歌賞賛を指してあなたに感謝して下さい
最後に、そこに不足しているか正しくない場合、感謝し、正しい私の批判をしてください!ご質問がある場合は、返信する絶対初めてメッセージを残してください!
私はあなたが技術、憧れの技術を探求するために、公共の数に焦点を当てることを歓迎、技術の追求は、良いポットは友達がああ来ていると述べました...