线程安全的单例模式

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(); //静态成员只有在第一次被引用的时候才会执行初始化 并且只初始化一次 节约开销
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容