单例模式的实现方式

一、懒汉式单例

//懒汉式单例类.在第一次调用的时候实例化自己 
public class Singleton {
    private Singleton() {}
    private static Singleton single=null;
    //静态工厂方法 
    public static Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
    }
}
 
以上是线程不安全的 ,在多线程下可能出现多个Singleton 实例,同时多个线程执行getInstance()
 
要线程安全可以这样做:
  1. 在getInstance方法上加同步
  public static synchronized Singleton getInstance() {
         if (single == null) {  
             single = new Singleton();
         }  
        return single;
 }    
 
 2. 双重检查锁定
 public static Singleton getInstance() {
        if (singleton == null) {  
            synchronized (Singleton.class) {  
               if (singleton == null) {  
                  singleton = new Singleton(); 
               }  
            }  
        }  
        return singleton; 
    }
 
3. 静态内部类
public class Singleton {  
    private static class LazyHolder {  
       private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
       return LazyHolder.INSTANCE;  
    }  
}  
 
 
 

二、饿汉式单例

 //饿汉式单例类.在类初始化时,已经自行实例化 
public class Singleton1 {
    private Singleton1() {}
    private static final Singleton1 single = new Singleton1();
    //静态工厂方法 
    public static Singleton1 getInstance() {
        return single;
    }
}
 
类创建的同时创建了一个静态对象,以后不再改变,所以天生线程安全
原文地址:https://www.cnblogs.com/sjm19910902/p/6386534.html