zoukankan      html  css  js  c++  java
  • 7种单例模式

    七种单例模式:

    懒汉式(线程不安全)

    //不推荐
    public class Singleton{
          private static Singleton instance;
          private Singleton();
    
          public static Singleton getInstance(){
                if(instance == null){
                      instance = new Singleton();
                }
                return this.instance;
          }
    }
    

    懒汉式(线程安全)

    //不推荐
    public class Singleton(){
          private static Singleton instance;      
          private Singleton();
    
          public static synchronized Singleton getInstance(){
                if(instance == null){
                      instance = new Singleton();
                }
                return this.instance;
          }
    }
    

    饿汉式

    public class Singleton{
          private static Singleton instance = new Singleton();
          private Singleton();
    
          public static Singleton getInstance(){
                return this.instance;
          }
    }
    

    饿汉式(变种)

    public class Singleton{
          private Singleton instance = null;
          static {
                instance = new Singleton();
          }
          private Singleton(){} 
          
          public static Singleton getInstance(){
                return this.instance;
          }
    }
    

    静态内部类

    //较推荐
    //采用这种方式的好处是,当Singleton类被装载时,内部类SingletonHolder不一定被初始化,因为没有显式的调用getInstance()方法。
    public class Singleton(){
          private static class SingletonHolder(){
                private static final Singleton INSTANCE = new Singleton();
          }
    
          private Singleton(){}
    
          public static final Singleton getInstance(){
                return SingletonHolder.INSTANCE;
          }
    }
    

    枚举

    //目前最好的单例实现方式,因为枚举底层已经实现,所以代码非常简练,而且可以避免反序列化重新创建对象和多线程同步的问题
    public enum Singleton{
          INSTANCE;
          public void watheverMethed(){}
    }
    

    双重校验锁

    //比较推荐的方式
    public class Singleton{
          private volatile static Singleton instance;      //被volatile修饰的变量可以保证其可见性(若值改变,其它线程立即可见,避免脏读)
          private Singleton(){}
          
          public static Singleton getInstance(){
                if(instance == null){
                      synchronized(Singleton.class){
                            if(instance == null){
                                  instance = new Singleton();
                            }
                      }
                }
                return this.instance;
          }
    }
    

  • 相关阅读:
    专注技术热爱生活
    js效果我的蒙板效果实现
    KMP算法
    九月份发现的好东东记录
    ATL SERVER
    不要把项目开发当做自己个人的展示舞台
    看ProMesh.NET项目领悟到的
    谈谈编译原理和其在WEB开发中的应用3
    开发更深层次的交流产品
    Hibernate3.3.2 手动配置annotation环境
  • 原文地址:https://www.cnblogs.com/LML97/p/13279486.html
Copyright © 2011-2022 走看看