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

  • 相关阅读:
    在有跳板机的情况下,SecureCRT自动连接到目标服务器
    JavaScript中使用console调试程序的坑
    Python中docstring文档的写法
    Nginx+uWSGI+Django原理
    uWSGI uwsgi_response_write_body_do(): Connection reset by peer 报错的解决方法
    Python LOGGING使用方法
    Python计算斗牛游戏的概率
    Python垃圾回收机制详解
    PhantomJS实现最简单的模拟登录方案
    如何设置Jquery UI Menu 菜单为横向展示
  • 原文地址:https://www.cnblogs.com/blackdd/p/12304529.html
Copyright © 2011-2022 走看看