单例模式

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

        }

}

 

打印的结果

 

原文地址:https://www.cnblogs.com/hmzxwky/p/6016533.html