设计模式初探之单例模式
单例模式概念:
单例模式一种常见得设计模式,顾名思义就是只能有一个实例。
单例模式应用场景:
线程池、缓存、日志对象以及各种配置的读取。
单例模式实现方法:
- 懒汉模式:能实现懒加载,但是在并发情况下使用synchronized 对性能有所影响。
- 饿汉模式:不能懒加载,消耗较大,在并发情况下是线程安全的。
- 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;
}
}