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);

            }

    }

     

    打印的结果

     

  • 相关阅读:
    JAVA 8的新特性
    JAVA中map的分类和各自的特性
    设计模式之工厂方法模式(附实例代码下载)
    为什么重写equals还要重写hashcode??
    C# static的用法详解
    1-RadioButton控件的用法
    C#三种常用的读取XML文件的方法
    VS2017 中安装SVN
    pip安装selenium时,报错“You are using pip version 10.0.1, however version 18.0 is available.”的问题
    问题:unknown error: call function result missing 'value' 解决方法
  • 原文地址:https://www.cnblogs.com/hmzxwky/p/6016533.html
Copyright © 2011-2022 走看看