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;
          }
    }
    

  • 相关阅读:
    2018.11.26
    JS数组
    JS2018.12.26
    手机游戏客户端架构设计
    IAP应用内购买
    cocos2dx如何优化内存的应用
    Homebrew
    OS X 文档
    Apple推送通知服务教程
    ajax分页
  • 原文地址:https://www.cnblogs.com/LML97/p/13279486.html
Copyright © 2011-2022 走看看