zoukankan      html  css  js  c++  java
  • 单例模式的多种实现方法

    最基本写法,也叫懒汉写法(线程不安全):

    public class Singleton {
    
      private static Singleton singleton;
    
      private Singleton() {
      }
    
      public static Singleton getInstance() {
       if (singleton == null) {
        singleton = new Singleton();
       }
       return singleton;
      }
    }

    饿汉式写法(因为是静态的,再项目启动的时候就加载好了,每一次调用都是同一个,不存在线程安全问题):

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

    例如:

    public class Test {
        public static void main(String[] args) {
            Singleton.getInstance();
            Singleton.getInstance();
        }
    }
    class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton (){
            System.out.println("我调用了");
        }
        public static Singleton getInstance() {
            return instance;
        }
    }

    结果:

     静态内部类:

    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 whateverMethod() {
       }
    }

    这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,jdk1.5中才加入enum特性

    双重校验锁:

    public class Singleton {
       private volatile static Singleton singleton;
       private Singleton (){}
       public static Singleton getSingleton() {
       if (singleton == null) {
           synchronized (Singleton.class) {
           if (singleton == null) {
               singleton = new Singleton();
           }
           }
       }
       return singleton;
       }
    }

     关于volatile关键字可以参考:

    Java中的双重检查锁(double checked locking)

  • 相关阅读:
    android状态栏
    python基础(二)——文件操作
    python基础(一)——字符串
    每日读书
    gradle相关
    EditText整体hint
    java生成pdf
    Androidstudio点9图报错
    【ASP.NET Core学习】使用JWT认证授权
    数据访问仓储模式的事务管理(Unit of Work)
  • 原文地址:https://www.cnblogs.com/lzghyh/p/12673186.html
Copyright © 2011-2022 走看看