-
要点
显然单例模式的要点有三个:
1. 是某个类只能有一个实例;
2. 是它必须自行创建这个实例;
3. 是它必须自行向整个系统提供这个实例。从具体实现角度来说,就是以下三点:
1. 是单例模式的类只提供私有的构造函数;
2. 是类定义中含有一个该类的静态私有对象;
3. 是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。 -
实现方式
饿汉模式(线程安全,调用效率高,但是不能延时加载)
public class SingletonDemo1{
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1(){}
public static SingletonDemo1 getInstance(){
return instance;
}
}
懒汉模式(线程不安全,可延时加载)
public class SingletonDemo2 {
//类初始化时,不初始化这个对象(延时加载,真正用的时候再创建)
private static SingletonDemo2 instance;
//构造器私有化
private SingletonDemo2(){}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance=new SingletonDemo2();
}
return instance;
}
}
静态内部类(线程安全未知?)
public class SingletonDemo3 {
private static class SingletonClassInstance{
private static final SingletonDemo3 instance=new SingletonDemo3();
}
private SingletonDemo3(){}
public static SingletonDemo3 getInstance(){
return SingletonClassInstance.instance;
}
}
DCL实现(线程安全)
public class SingletonDemo5 {
private volatile static SingletonDemo5 SingletonDemo5;
private SingletonDemo5() {
}
public static SingletonDemo5 newInstance() {
if (SingletonDemo5 == null) {
synchronized (SingletonDemo5.class) {
if (SingletonDemo5 == null) {
SingletonDemo5 = new SingletonDemo5();
}
}
}
return SingletonDemo5;
}
}
枚举类实现(线程安全)
/**
* 使用枚举的单例模式
*
* @author yzl
* @see [相关类/方法](可选)
* @since [产品/模块版本] (可选)
*/
public class EnumSingleton{
private EnumSingleton(){}
public static EnumSingleton getInstance(){
return Singleton.INSTANCE.getInstance();
}
private static enum Singleton{
INSTANCE;
private EnumSingleton singleton;
//JVM会保证此方法绝对只调用一次
private Singleton(){
singleton = new EnumSingleton();
}
public EnumSingleton getInstance(){
return singleton;
}
}
}