设计模式初探之单例模式

设计模式初探之单例模式

单例模式概念:

​ 单例模式一种常见得设计模式,顾名思义就是只能有一个实例。

单例模式应用场景:

​ 线程池、缓存、日志对象以及各种配置的读取。

单例模式实现方法:

  1. 懒汉模式:能实现懒加载,但是在并发情况下使用synchronized 对性能有所影响。
  2. 饿汉模式:不能懒加载,消耗较大,在并发情况下是线程安全的。
  3. Holder模式:饿汉模式和懒汉模式的组合,既实现了懒汉模式的懒加载又实现了饿汉模式的安全性,而且没有使用synchronized 性能得到了保证,同时也是工作中常用的方式。
/**
*	懒汉模式一(非线程安全实现)
*/
public class Singleton{
    private static Singleton single;
  
    private Singleton(){}
    
    public static Singleton getInstance(){
        if (null == single){
            single = new Singleton();
        }
        return single;
    }
}

/**
*	懒汉模式二(线程安全实现)
*/
public class Singleton{
    private static Singleton single;
  
    private Singleton(){}
    
    /**
    *	在getInstance方法上加同步,每次调用都会加锁,效率较低
    */
    public static synchronized Singleton getInstance(){
        if (null == single){
            single = new Singleton();
        }
        return single;
    }
}

/**
*	懒汉模式三(线程安全实现)
*/
public class Singleton{
    private volatile static Singleton single;
  
    private Singleton(){}
 
    /**
    *  双重检查锁定,只有在没有实例的时候加锁,效率进一步提高
    */
    public static Singleton getInstance(){
        if (null == single){
             synchronized (Singleton.class) { 
                  if (null == single){
                      single = new Singleton();
                  }
             }
        }
        return single;
    }
}


/**
*	饿汉模式(天生线程安全)
*/
public class Singleton{
    private static Singleton single = new Singleton();
    
    private Singleton(){};
    
    public static Singleton getInstance(){
        return single;
    }
}

/**
* Holder模式(线程安全,工作中常用方式)
*/

public class Singleton{
    
    private Singleton(){};
    
    /**
    *	私有静态内部类,该内部类的实例没有与外部类的实力存在绑定关系,因而只有被调用的时候才会加载,从而实现延迟加载
    */
   	private static class InnerClass(){
        private static Singleton single = new Singleton();
    }

    public static Singleton getInstance(){
        return InnerClass.single;
    }
}



版权声明:本文为m0_47372765原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。