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

    懒汉、饿汉、双重校验锁

    1、懒汉:需要时才会去创建

    public Class Singleton{

      private static Singleton instance = null;

      private  Singleton(){}

      public static synchronized Singleton getInstance(){

        if( instance == null ){instance = new Singleton(); }

        return instance;

      }

    }

    2、饿汉:线程安全,类加载时就创建了实例

    public Class Singleton{

      private static Singleton instance = new Singleton();

      private  Singleton(){}

      public static Singleton getInstance(){

        return instance;

      }

    }

    //饿汉方式可做变种,将实例放入静态代码块中:

    static{

      instance  = new Singleton();

    }

    3、双重校验锁: volatile 修饰实例变量,同时synchronized同步方法

      在懒汉实现中,如果两个线程同时执行了if判断为null的情况,则会依次执行同步代码块里的代码,为避免创建两个实例,在同步代码块里添加if进行二重校验。

    public Class Singleton{

      private static volatile Singleton instance = null;    //volatile是jdk1.5后才有的

      private  Singleton(){}

      public static  Singleton getInstance(){

        if( instance == null ){

          Synchronized(Singleton.class){

            if(instance == null){

              instance = new Singleton();

            }  

          }

         }

        return instance;

      }

    }

    另:还有静态内部类的实现方式,相当于把饿汉的创建实例方式提到内部类,在外部类getInstance方法内return它的内部类变量(此种方式是线程安全的)

  • 相关阅读:
    JVMTIAgent
    Java 虚拟机编程接口JVMIT
    Java调试平台体系JPDA
    什么是缓存
    2019第49周日
    什么是你拥有的资本
    java里的static/final含义
    Java语言和JVM的使用说明书
    画图前端:mermaid。时序图/类图/甘特图/流程图/状态图/饼图。类似工具:Typora
    java通过下划线数字字面量增加可读性:10_00_00表示100000
  • 原文地址:https://www.cnblogs.com/blackdd/p/12304529.html
Copyright © 2011-2022 走看看