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

  • 相关阅读:
    Codeforces 358 D. Dima and Hares
    sublime Text3配置及快捷键、插件推荐总结
    免费WiFi,仅仅为好久没联系的你们
    史上最简单的带流控功能的http server
    微软2014校园招聘笔试试题
    python 3Des 加密
    MySQL slave状态之Seconds_Behind_Master
    APP安全环节缺失,手游运营商怎样应对APP破解困境
    读完了csapp(中文名:深入理解计算机系统)
    static使用方法小结
  • 原文地址:https://www.cnblogs.com/LML97/p/13279486.html
Copyright © 2011-2022 走看看