悪役シングルトンパターン:
/ *
-
悪人は問題ありませんので、マルチスレッドとスレッドセーフの場合には、オブジェクトを初期化するための時間を考えるためのスペースを持つシングルトンパターン、。
- @author管理者
-
* /
publicクラスWickedManSingleTon {
プライベート静的WickedManSingleTonインスタンス=新しいWickedManSingleTon();
プライベートWickedManSingleTon(){
}
パブリック静的WickedManSingleTon getIntance(){
インスタンスを返します。
}
}
レイジーモード:
/ **
-
シングルアイドラー実施の形態では、スペースの概念のための時間、シングルトンの例は、複数のスレッドの場合、スレッドの安全性の問題が存在します。
- @author管理者
-
* /
publicクラスLasyManSingleTon {
プライベート静的LasyManSingleTonインスタンス= NULL;
プライベートLasyManSingleTon(){
}
パブリック静的LasyManSingleTonのgetInstance(){
IF(例えば== NULL){
インスタンス=新しいLasyManSingleTon()。
}
インスタンスを返します。
}
}
/ **
- ダブル検索はシングルトンを達成します
- アドバンテージ@author管理者DCLモードは、そのオブジェクトがインスタンスを決定するのは初めてのため、作成するために使用する必要があるだけです==
- 不要なヌルロック、インスタンスをインスタンス化するための唯一の第1のロードロックを避けるために。これは、メモリ空間を節約するだけでなく、スレッドの安全性を確保できます。しかし、注文による執行機能のJVM、DCLスレッド危険な状況が生じることになります。次のように具体的な分析は次のとおりです。
- INSTANCE =新しいDCLInstance();
- このステップでは、実際には、3段階のJVMの実行内側:
- オープンヒープメモリ空間1.。
- ヒープメモリパラメーター内部シングルトンの例のそれぞれにおいて2。
- 3.オブジェクトは、ヒープメモリ空間を指します。
- なぜならオーダー実行JVM機能の、それが起因3、インスタンスの実行のために、この時間は、スレッドBに切り替えられた場合、最初の3つの上で実行される2で実行しなくてもよいです
-
非空で、直接実行に使用されますしている、このような場合は、例外があるでしょう。これは有名なDCLの失敗です。
* /
パブリッククラスDCLInstance {
//手書きのデュアル取得
プライベート静的DCLInstanceインスタンス= NULL; //最適化揮発性を利用してプライベートDCLInstance(){
}
パブリック静的DCLInstanceのgetInstance(){
if (instance == null) { // 同步操作 synchronized (DCLInstance.class) { if (instance == null) { // 多线程环境下可能会出现问题的地方 instance = new DCLInstance(); } } } return instance;
}
}
/ **
- @author管理者
- シングルトンパターンを実装内部クラスとして:
- 利点は、静的な内部クラスです。このクラスは、外部負荷直後に内部クラスをロードする必要はありません、クラスが初期化されていないインスタンス内にロードされていない、それはメモリを考慮していません。
- これは、のgetInstance()メソッドが最初に呼び出されたときにのみ、シングルトンが最初にロードされたとき、ある、SingleTonHolerをロードする必要はありません
- 初期化INSTANCEを行くだろう、最初のコールのgetInstance()メソッドは、SingleTonHolerクラスをロードするために仮想マシンを引き起こし
- このアプローチだけでなく、スレッドセーフではなく、一つのケースの一意性を保証するだけでなく、シングルトンのインスタンス化を遅延させます。
-
* /
publicクラスInerClassMakeIntance {プライベート静的InerClassMakeIntanceインスタンス= NULL;
プライベートInerClassMakeIntance(){
}
パブリック静的InerClassMakeIntanceのgetInstance(){
InerInstance.t1を返します。
}プライベート静的クラスInerInstance {
プライベート静的InerClassMakeIntanceさt1 =新しいInerClassMakeIntance()。
}
}