设计模式之单例模式

参考http://blog.csdn.net/jason0539/article/details/23297037/

概念:

      java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。

单例模式有以下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

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

public class Singleton{

  private Singleton(){}   

  private static Singleton insatnce=new Singleton();

  public static Singleton getInstance(){

    return insatnce;

  }

}

Singleton 类只有一个构造函数,它被private修饰,客户无法创建该类的实例。

此实现是线程安全的,这是因为当JVM在加载此类时,对于static属性的初始化只能由一个线程执行且只执行一次。

懒汉式单例:

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

  1. public class LazySingleton {  
  2.     private LazySingleton() {}  
  3.     private static LazySingleton single=null;  
  4.     //静态工厂方法   
  5.     public static LazySingleton getInstance() {  
  6.          if (single == null) {    
  7.              single = new LazySingleton();  
  8.          }    
  9.         return single;  
  10.     }  
  11. }  

懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,要实现线程安全,有以下三种方式,都是对getInstance这个方法改造,保证了懒汉式单例的线程安全。

1、在getInstance方法上加同步

  1. public static synchronized Singleton getInstance() {  
  2.          if (single == null) {    
  3.              single = new Singleton();  
  4.          }    
  5.         return single;  
  6. }  

但是加synchronized会使得性能大不如前

2、双重检查锁定

    private volatile static Singleton single=null;

  1. public static Singleton getInstance() {  
  2.         if (singleton == null) {    
  3.             synchronized (Singleton.class) {    
  4.                if (singleton == null) {    
  5.                   singleton = new Singleton();   
  6.                }    
  7.             }    
  8.         }    
  9.         return singleton;   
  10.     }  

代码解释

 

3、静态内部类

  1. public class Singleton {    
  2.     private static class LazyHolder {    
  3.        private static final Singleton INSTANCE = new Singleton();    
  4.     }    
  5.     private Singleton (){}    
  6.     public static Singleton getInstance() {    
  7.        return LazyHolder.INSTANCE;    
  8.     }    
  9. }    

当JVM加载Singleton时,由于此类没有static,所以加载完成后就返回,只有在第一次调用getInstance时,JVM才会加载LazyHolder类,才会初始化Singleton。

原文地址:https://www.cnblogs.com/xiaolovewei/p/7727882.html