单例模式顾名思义,全局唯一仅仅有且只有一个对象实例。在此列举Java单例模式的几种实现方式,各有优缺点。
懒汉式
- 延迟加载
- 线程不安全
- 实现简单
public class Singleton {
private static Singleton instance;//静态实例
private Singleton (){}//构造私有(反射可破坏单例)
//可加synchronized同步,但粒度太大,效率低
public static Singleton getInstance() {
//此处多线程环境会有破坏单例的风险
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
饿汉式
- 及时加载
- 线程安全(类加载即在内存中加载一次)
- 实现简单
public class Singleton {
private static Singleton instance = new Singleton();//静态实例
private Singleton (){}//构造私有(反射可破坏单例)
public static Singleton getInstance() {
return instance;
}
}
枚举
- 实现简单
- 线程安全
- 结构单一
public enum Singleton {
INSTANCE;
public static Singleton getInstance() {
return INSTANCE;
}
}
双重校验锁
- 线程安全
- 延迟加载
public class Singleton {
private static Singleton instance;//静态实例
private Singleton (){}//构造私
- List item
有
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class){
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
静态内部类
- 线程安全
- 懒加载
- 推荐使用
package com.example.design.singleton;
public class Singleton {
private Singleton (){}//构造私有
public static Singleton getInstance(){
return Singleton.innerSign.instance;
}
//静态内部类
private static class innerSign{
private static Singleton instance = new Singleton();//类加载仅加载一次
}
}
其实单例模式还有很多种实现手段,只要符合单例的定义,根据实际业务场景选择合适的处理方式。