4.シングルトン

  • まず、定義
    • クラスはインスタンスを1つだけ持っていることを確認し、それをアクセスするために、グローバルアクセスポイントを提供するために、
  • 第二に、アプリケーションシーン
    • 頻繁には、オブジェクトを作成するのにかかる時間を節約し、オブジェクトを使用するが、状態の頻繁な変更の目的は、単一のケースのモデルに適していないため
    • 圧力GCを低減する、新しい動作が低減されるので、システム・メモリの使用頻度が低減され、GCの休止時間を短縮します
  • 第三に、例
    • 実施形態は、Java言語で一般的にシングルモードでは、2つのメンバ・メソッドがあります。
    1. 飢え機器:全体構成のシングルトンインスタンスクラスがロードされています
    2. レイジーモード:シングルトンインスタンスは、それが使用される最初の時間の全体的な構造を意味します
    • 飢えた方法(スレッドセーフ)
      public class Singleton1 {
          //在静态初始化器中创建单例实例,这段代码保证了线程安全
          private static Singleton1 uniqueInstance = new Singleton1();
    
          //Singleton类只有一个构造方法并且是被private修饰的,所以用户无法通过new方法创建该对象实例
          private Singleton1(){}
    
          public static Singleton1 getInstance(){
            return uniqueInstance;
          }
      }
    • レイジー方法(非スレッドセーフ)
       public class Singleton2 {
           private static Singleton2 uniqueInstance;
    
           private Singleton2 (){
           }
    
           //没有加入synchronized关键字的版本是线程不安全的
           public static Singleton2 getInstance() {
           //判断当前单例是否已经存在,若存在则返回,不存在则再建立单例
           if (uniqueInstance == null) {
               uniqueInstance = new Singleton2();
           }
    
           return uniqueInstance;
      }
    • 怠惰な人間の(スレッドセーフ)
       public class Singleton3 {
           private volatile static Singleton3 uniqueInstance;
    
           private Singleton3 (){
           }
    
           //没有加入synchronized关键字的版本是线程不安全的
           public static Singleton3 getInstance() {
    
               synchronized(Singleton3.class) {
                   //判断当前单例是否已经存在,若存在则返回,不存在则再建立单例
                   if (uniqueInstance == null) {
                      uniqueInstance = new Singleton3();
                   }
               }
    
               return uniqueInstance;
           }
       }     
    • 怠惰な人間の(ダブルチェックロックバージョン)
       public class Singleton4 {
           //volatile保证,当uniqueInstance变量被初始化成Singleton实例时,多个线程可以正确处理uniqueInstance变量
           private volatile static Singleton4 uniqueInstance;
    
           private Singleton4() {
           }
    
            public static Singleton4 getInstance() {
    
               //检查实例,如果不存在,就进入同步代码块
               if (uniqueInstance == null) {
                   //只有第一次才彻底执行这里的代码
                   synchronized (Singleton4.class) {
                       //进入同步代码块后,再检查一次,如果仍是null,才创建实例
                       if (uniqueInstance == null) {
                           uniqueInstance = new Singleton4();
                       }
                   }
               }
    
               return uniqueInstance;
           }
      }
    • 怠惰(式登録/モード静的内部クラス)
       public class Singleton5 {
           private static class SingletonHolder {
               private static final Singleton5 INSTANCE = new Singleton5();
           }
    
           private Singleton5 (){}
    
           public static final Singleton5 getInstance() {
               return SingletonHolder.INSTANCE;
           }
       }             
    • 飢えモード(列挙)
       ////这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。 它更简洁,自动支持序列化机制,绝对防止多次实例化 (如果单例类实现了Serializable接口,默认情况下每次反序列化总会创建一个新的实例对象)
       public enum  Singleton6 {
           //定义一个枚举的元素,它就是 Singleton 的一个实例
           INSTANCE;
    
           public void doSomeThing() {
              System.out.println("枚举方法实现单例");
           }
       }

おすすめ

転載: www.cnblogs.com/zhongj/p/11239349.html