1. 类图
Singleton:负责创建Singleton类自己的唯一实例,并提供一个getInstance的方法,让外部来访问这个类的唯一实例
2. 示例
2.1 懒汉式单例
/**
* 饿汉式单例:初始化时直接创建
*/
public class HungrySingleton {
private static HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return hungrySingleton;
}
}
2.2 饿汉式单例
/**
* 懒汉式单例:调用时创建
*/
public class LazySingleton {
private static LazySingleton lazySingleton = null;
private LazySingleton(){}
public static LazySingleton getInstance(){
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
2.3 双检锁
/**
* 双检锁单例:volatile可能会屏蔽掉虚拟机中一些必要的代码优化,运行效率不是很高
*/
public class DoubleCheckSingleton {
private volatile static DoubleCheckSingleton doubleCheckSingleton = null;
private DoubleCheckSingleton(){}
public static DoubleCheckSingleton getInstance(){
if (doubleCheckSingleton == null) {
synchronized (DoubleCheckSingleton.class){
if (doubleCheckSingleton == null) {
doubleCheckSingleton = new DoubleCheckSingleton();
}
}
}
return doubleCheckSingleton;
}
}
2.4 静态内部类
/**
* 静态内部类
*/
public class StaticInnerSingleton {
private StaticInnerSingleton(){}
// 类级的内部类,该内部类的实例与外部类的实例无绑定关系,且只有在被调用时才会装载,从而实现延迟加载
private static class SingletonHolder{
// 静态初始化器,由JVM来保证线程安全
private static StaticInnerSingleton staticInnerSingleton = new StaticInnerSingleton();
}
public static StaticInnerSingleton getInstance(){
return SingletonHolder.staticInnerSingleton;
}
}
2.5 枚举
/**
* 枚举单例:无偿提供了序列化机制,防止多次实例化
*/
public enum EnumSingelton {
uniqueInstance;
public void singletonOperation(){
// 功能处理
}
}