单例的四大原则:
1.构造私有。
2.以静态方法或者枚举返回实例。
3.确保实例只有一个,尤其是多线程环境。
4.确保反序列化时不会重新构建对象。
单例的五种实现
一、饿汉式
private static SingleTon INSTANCE = new SingleTon();
private SingleTon() {
}
public static SingleTon getInstance() {
return INSTANCE;
}
}
优点:线程安全
缺点:浪费空间
二、懒汉式
public class SingleTon {
private static SingleTon INSTANCE;
private SingleTon() {
}
public static SingleTon getInstance() {
if (INSTANCE == null) {
INSTANCE = new SingleTon();
}
return INSTANCE;
}
}
优点:延迟加载,节省空间
缺点:不是线程安全的
三、静态内部类
public class SingleTon {
private SingleTon() {
}
public static SingleTon getInstance() {
return SingleTonHolder.INSTANCE;
}
private static class SingleTonHolder {
private static SingleTon INSTANCE = new SingleTon();
}
}
优点:延迟加载,线程安全
缺点:不能传参
四、双重校验锁(Double Check Lock)
public class SingleTon {
private static volatile SingleTon INSTANCE;
private SingleTon() {
}
public static SingleTon getInstance() {
if (INSTANCE == null) {
synchronized (SingleTon.class) {
if (INSTANCE == null) {
INSTANCE = new SingleTon();
}
}
}
return INSTANCE;
}
}
优点:延迟加载,线程安全,可传参
缺点:volatile会稍微影响性能,在这里的作用是禁止指令重排序
Java volatile关键字最全总结:原理剖析与实例讲解(简单易懂)
volatile关键字在Android中到底有什么用?
五、枚举
enum SingleTon {
INSTANCE;
void method() {
}
}
优点:线程安全,代码简单
缺点:不能传参,不能延时加载
结论:推荐第三种 DCL方式