线程安全的单例模式

2016-01-07  本文已影响82人  优雨

DLC(双重检查锁)+volatile关键字实现:

public class Singleton {    //高并发情况下的安全单例    
  private static volatile Singleton instance; //禁止初始化对象过程中的指令的重排序    
  private Singleton(){}    
  public static Singleton getInstance(){//DCL 双重检查锁        
    if(instance == null){//第一次检查是看看instance是否被创建了            
        synchronized (Singleton.class){ //之所以不将方法设为synchronize是为了减少开销                
            if(instance == null){//第二次检查是防止多个线程同时准备创建instance的情况                   
               instance = new Singleton();                
            }           
         }        
    }        
     return instance;    
   }
}

使用静态Holder类

public class Singleton {
    //静态内部Holder类的实现
    private Singleton(){}

    public static Singleton getInstance(){
        return Holder.mInstance;
    }

    private static class Holder{ //由类加载器加载类的时候保证线程安全 加载类的时候会上锁
        public static Singleton mInstance = new Singleton(); //静态成员只有在第一次被引用的时候才会执行初始化 并且只初始化一次 节约开销
    }
}
上一篇 下一篇

猜你喜欢

热点阅读