目次
概念:
シングルトン:クラスにインスタンスが1つしかないことを確認し、インスタンスにアクセスするためのグローバルアクセスポイントを提供します。
一般的なアプリケーションシナリオ
長所と短所:
シングルトンはインスタンスを1つだけ生成し、システムパフォーマンスのオーバーヘッドを削減します
実現する方法:
主に:
ハングリーマンモード(スレッドセーフ、高い呼び出し効率、遅延読み込みなし)
レイジーマンモード(スレッドセーフ、低い呼び出し効率、遅延読み込み)
その他の
二重検出些細なこと(内部モデルの基礎となるJVMの内部モデルのため、時折問題が発生する)発生する可能性があります、使用はお勧めしません)
静的内部タイプ(スレッドセーフ、高い呼び出し効率、遅延でロード可能)
列挙された単一列(スレッドセーフ、高呼び出し効率、遅延でロードできない)
1.空腹の男のスタイルの実現
長所と短所:
クラスはロード時に作成されます。getInstanceが呼び出されない場合、クラスは使用されないため、リソースが浪費され
ます。作成手順:
1。プライベート構築2.静的プライベート変数2.パブリック静的メソッド
public class Demo1 {
private static Demo1 demo1 = new Demo1();
private Demo1(){
}
public static Demo1 getInstance(){
return demo1;
}
}
Demo1 demo1 = Demo1.getInstance();
2.怠惰な実装
長所と短所:リソースの使用効率は高いですが、getInstance()メソッドを呼び出すたびに同期する必要があるため、非効率的です。
作成手順:
1。プライベート構築2.プライベート静的変数2.会社には静的メソッドがあります
public class Demo {
private static Demo demo;
private Demo(){
}
public synchronized static Demo getInstance(){
if (demo == null){
demo = new Demo();
}
return demo;
}
3.二重検出トリビアルタイプ(通常は使用されません)
4.静的内部クラスの実装(遅延読み込み)
キーポイント:
外部にstaitc属性がない場合、オブジェクト
は空腹の中国スタイルのようにすぐにはロードされません。getInstance ()が実際に呼び出された場合にのみ、静的内部クラスがロードされます。これは、クラスのロード時にスレッドセーフです。インスタンスは静的な最終タイプであり、そのようなインスタンスのみがメモリに存在し、一度だけ割り当てることができるため、スレッドの安全性が確保されます。これは、同時かつ効率的な呼び出しと遅延読み込みの利点を兼ね備えています。
public class Demo2 {
private static class SignalClass{
private static final Demo2 demo2 = new Demo2();
}
public static Demo2 getInstance(){
return SignalClass.demo2;
}
private Demo2(){
}
}
5.列挙の実装
利点:
実装が簡単です。
列挙自体は単一列モードであり、JVMは基本的に、リフレクションと逆シリアル化の抜け穴を回避するための保証を提供します。
欠点:
遅延読み込みがありません。
public enum Demo3 {
INSTANCE; //这个枚举元素,本身就是单列对象
}
注:リフレクションは上記のいくつかの実装方法をクラックする可能性がありますが、列挙はできません