常见的五种单例模式实现方式及其特点
– 主要:
. 饿汉式(线程安全,调用效率高。 但是,不能延时加载。)
. 懒汉式(线程安全,调用效率不高。 但是,可以延时加载。)
– 其他:
. 双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)
. 静态内部类式(线程安全,调用效率高。 但是,可以延时加载)
. 枚举式(线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列
化漏洞!)
. 如何选用?
– 单例对象 占用 资源 少,不需要 延时加载:
. 枚举式 好于 饿汉式
– 单例对象 占用 资源 大,需要 延时加载:
. 静态内部类式 好于 懒汉式
单例模式只生成一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
饿汉式:
public class Singleton {
private static /*final*/ Singleton s = new Singleton();
private Singleton(){} //私有化构造器
public static /*synchronized*/ Singleton getInstance(){
return s;
}
}
懒汉式:
public class Singleton {
private static Singleton s;
private SingletonDemo01(){} //私有化构造器
public static synchronized Singleton getInstance(){
if(s==null){
s = new Singleton();
}
return s;
}
}
双重检测锁:
public class SingletonDemo03 {
private static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
SingletonDemo03 sc;
synchronized (Singleton.class) {
sc = instance;
if (sc == null) {
synchronized (Singleton.class) {
if(sc == null) {
sc = new Singleton();
}
}
instance = sc;
}
}
}
return instance;
}
private Singleton() {
}
}
静态内部类方法:
public class Singleton {
private static class SingletonClassInstance {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonClassInstance.instance;
}
private Singleton() {
}
}
枚举模式:
public enum SingletonDemo05 {
/**
* 定义一个枚举的元素,它就代表了Singleton的一个实例。
*/
INSTANCE;
/**
* 单例可以有自己的操作
*/
public void singletonOperation(){
//功能处理
}
}