参考链接: 单例模式
一、实现对比
推荐指数 | 实现方式 | 多线程安全 | Lazy初始化 | 实现难度 | 内存消耗 | 执行效率 | JDK版本 |
---|---|---|---|---|---|---|---|
**** | 枚举 | 是 | 否 |
易 | 良 |
高 | 1.5+ |
**** | 饿汉式 | 是 | 否 |
易 | 良 |
高 | - |
*** | 静态内部类 | 是 | 是 | 一般 |
优 | 高 | - |
** | 双检锁/双重校验锁(DCL) | 是 | 是 | 复杂 |
优 | 高 | 1.5+ |
* | 懒汉式(非线程安全) | 否 |
是 | 易 | 优 | 高 | - |
* | 懒汉式(线程安全) | 是 | 是 | 易 | 优 | 极低 |
- |
二、实现方式
懒汉式(非线程安全)
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 static Singleton instance;
private Singleton (){}
public static synchronized 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;
}
}
Classloder机制避免了多线程的同步问题
双检锁/双重校验锁(DCL)
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
[推荐] 静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
Classloder机制避免了多线程的同步问题
[推荐] 枚举
public enum Singleton {
INSTANCE;
public static Singleton getInstance() {
return INSTANCE;
}
public void method() {
}
}
网友评论