• 单例模式的三种实现方式


    懒汉、饿汉、双重校验锁

    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它的内部类变量(此种方式是线程安全的)

  • 相关阅读:
    用一条UPDATE语句交换两列的值
    js之事件冒泡和事件捕获详细介绍
    C# String与string的区别
    setTimeout()和setInterval()方法的区别?
    jQuery的.bind()、.live()和.delegate()之间区别
    在Hyper-V虚拟机中使用Wi-Fi上网
    调整框架的尺寸,是否显示滚动条,跳出框架
    调整框架的尺寸
    查看jquery绑定的事件函数
    Onload,Onunload,onbeforeunload,$(window).load(function() {})和$(document).ready(function(){})
  • 原文地址:https://www.cnblogs.com/blackdd/p/12304529.html
Copyright © 2020-2023  润新知