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

  • 相关阅读:
    什么是PV UV PR值
    手工测试了各个搜索引擎对博客文章的收录
    Linux 常用命令
    部分linux命令详解
    左右滑屏的实现
    网络资源下载时断点续传的实现
    MYSQL5.5.37win32.msi 这个版本得程序包谁有吗 可以给我一下吗?
    Linux(CentOS6.5) 开放端口,配置防火墙
    centos7 下出现 yum list 报错 还有yum groupolist 查询软件组列表报错
    linux命令(1):ls命令
  • 原文地址:https://www.cnblogs.com/blackdd/p/12304529.html
Copyright © 2011-2022 走看看