该系列文章为博主学习笔记,原文请参考参考链接
本文禁止转载,但是欢迎大家留言区留言交流[微笑]
理(面)解(试)单例模式:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
饿汉式:
//饿汉式
//类被加载时就将自己实例化,它的优点在于无须考虑多线程访问问题,可以确
//保实例的唯一性
//从调用速度和反应时间角度来讲,由于单例对象一开始就得以创建,因此要优
//于懒汉式单例
//由于在类加载时该对象就需要创建,因此从资源利用效率角度来讲,饿汉式单
//例不及懒汉式单例
public class EagerSingleton {
private static final EagerSingleton eagerSingleton=new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getEagerSingleton() {
return eagerSingleton;
}
}
懒汉式:
//懒汉式
//在第一次使用时创建,无须一直占用系统资源
public class LazySingleton {
private volatile static LazySingleton lazySingleton = null;
private LazySingleton(){}
public static LazySingleton getLazySingleton() {
if (lazySingleton == null) {
synchronized (LazySingleton.class) {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
这里面一定要加上volatile这个关键字,该关键字的思想是happen-before规则
loDH:
//IoDH
//结合了懒汉式和饿汉式的优点
public class Singleton {
private Singleton(){}
private static class HolderClass{
private static final Singleton singleton=new Singleton();
}
public static Singleton getSingleton() {
return HolderClass.singleton;
}
}
微信公众号:
QQ群:365473065