zoukankan      html  css  js  c++  java
  • 单例模式

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。
      单例模式有以下特点:
      1、单例类只能有一个实例。
      2、单例类必须自己创建自己的唯一实例。
      3、单例类必须给所有其他对象提供这一实例。

    一、懒汉式单例

    //懒汉式单例类.在第一次调用的时候实例化自己   

    public class Singleton {  

      private Singleton() {}  

      private static Singleton single=null;  

      //静态工厂方法   

      public static Singleton getInstance() {  

           if (single == null) {    

               single = new Singleton();  

           }    

          return single;  

      }  

    Singleton通过将构造方法限定为private避免了类在外部被实例化,

    在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。

     

    二、饿汉式单例

    public class Singleton1 {

    private static Singleton1 instance = null;

    static {

    instance = new Singleton1();

    }

     

    private Singleton1(){

     

    }

     

    public static Singleton1 getInstance(){

    return instance;

    }

    }

    饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。 

     

     

    //饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存;

    //懒汉式单例类线程安全控制烦琐,而且性能受影响。

    //Initialization Demand Holder (IoDH)

    //在IoDH中,我们在单例类中增加一个静态(static)内部类,既实现了线程安全,又避免了同步带来的性能影响。

    //在该内部类中创建单例对象,再将该单例对象通过getInstance()方法返回给外部使用

     

    public class SingletonIniti {

            private SingletonIniti() {

            

            }

            private static class SingletonHolder {

                    private static final SingletonIniti INSTANCE = new SingletonIniti();

             }

            

            public static SingletonIniti getInstance() {

                    return SingletonHolder.INSTANCE;

            }

            

            public static void main(String args[]) {

            SingletonIniti s1, s2; 

                s1 = SingletonIniti.getInstance();

                s2 = SingletonIniti.getInstance();

                System.out.println(s1==s2);

            }

    }

     

    打印的结果

     

  • 相关阅读:
    获得CCNA和CCNP及CCIE认证的必备条件和有效期绍
    Js6利用class创建类
    Js6利用class创建类
    权益证明机制 (PoS):权益决定验证权,谁更有钱谁发言
    关于共识机制的一些想法
    有向无环图 (DAG) 技术:超越区块链的分布式账本
    寻找一种易于理解的一致性算法(扩展版)
    如何使用python语言中的方法对列表进行增删改操作
    如何操作python语言中的元素并计算相应的属性
    如何操作python语言中的列表并获取对应的元素
  • 原文地址:https://www.cnblogs.com/hmzxwky/p/6016533.html
Copyright © 2011-2022 走看看