1 单例设计模式

Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。

1.1 特点

  1. 单例类只能有一个实例。

  2. 私有构造方法

  3. 单例类必须自己创建自己的唯一实例。

  4. 单例类必须给所有其他对象提供这一实例。

1.2 常用的单例模式写法

  1. 懒汉式单例:在第一次调用的时候实例化自己;

    1. 懒汉式1:线程不安全

      public class Singleton {  
          private Singleton() {}//私有构造行数,避免类在外部被实例化
          private static Singleton single=null;  
          //静态工厂方法
          public static Singleton getInstance() {  
               if (single == null) {    
                   single = new Singleton();  
               } 
              return single;  
          } 
      }
      
    2. 懒汉式2:在getInstance方法上加同步,使得线程安全

      public class Singleton {  
          private Singleton() {}//私有构造行数,避免类在外部被实例化
          private static Singleton single=null;  
          //静态工厂方法 加上了同步,使得线程安全
          public static synchronized Singleton getInstance() {  
               if (single == null) {    
                   single = new Singleton();  
               }    
              return single;  
          }
      }
      
    3. 懒汉式3:双重检查锁定,线程安全

      public class Singleton {  
          private Singleton() {}//私有构造行数,避免类在外部被实例化
          private static Singleton single=null;
      
          public static Singleton getInstance() {  
              if (singleton == null) {    
                  synchronized (Singleton.class) {//同步锁住,使得线程安全  
                     if (singleton == null) {    
                        singleton = new Singleton();   
                     }    
                  }    
              }
              return singleton;   
          }
      }
      
    4. 懒汉式4:静态内部类,线程安全。因为内部在第一次调用的时候,类只会被加载一次。

      public class Singleton {
          private static class LazyHolder {
             private static final Singleton INSTANCE = new Singleton();   
          } 
          private Singleton (){}//私有构造函数
          public static final Singleton getInstance() {    
             return LazyHolder.INSTANCE;    
          }    
      }
      
  2. 饿汉式单例:在类初始化时,已经自行实例化 线程安全

    public class Singleton1 {  
        private Singleton1() {}//私有构造函数 
        private static final Singleton1 single = new Singleton1(); 
        //静态工厂方法   
        public static Singleton1 getInstance() {  
            return single;  
        }  
    }
    

results matching ""

    No results matching ""