Java实现单例模式的8种方法
- 饿汉式(2种)
- 懒汉式(3种)
- 双重检查锁(DCL)
- 静态内部类
- 枚举
饿汉式
// 饿汉之静态变量 / 常量:线程安全、非懒加载(浪费资源)
class Singleton1{
private Singleton1(){};
private static final Singleton1 INSTANCE = new Singleton1();
public static Singleton1 getInstance(){
return INSTANCE;
}
}
// 饿汉之静态代码块:线程安全、非懒加载(节省资源)
class Singleton2{
private Singleton2(){};
private static Singleton2 instance;
static {
instance = new Singleton2();
}
public static Singleton2 getInstance(){
return instance;
}
}
懒汉式
// 懒汉之静态变量:线程不安全、懒加载(节省内存)
class Singleton3{
private Singleton3(){};
private static Singleton3 instance;
public static Singleton3 getInstance(){
if (instance == null){
instance = new Singleton3();
}
return instance;
}
}
// 懒汉之同步方法:线程安全、效率低、懒加载(节省内存)
class Singleton4{
private Singleton4(){};
private static Singleton4 instance;
public static synchronized Singleton4 getInstance(){
if (instance == null) instance = new Singleton4();
return instance;
}
}
// 懒汉之同步代码块:线程不完全安全、效率有所提升、懒加载(节省内存)
class Singleton5{
private Singleton5(){};
private static Singleton5 instance;
public static Singleton5 getInstance(){
if (instance == null) {
synchronized (Singleton5.class){
instance = new Singleton5();
}
}
return instance;
}
}
双重检查锁(DCL)+ volatile
创建对象的步骤:1、开辟内存
2、初始化实例
3、返回地址给引用
// 双重检查锁(DCL):线程完全安全、懒加载(节省内存)
class Singleton6{
private Singleton6(){};
private static volatile Singleton6 instance;
public static Singleton6 getInstance(){
if (instance == null) {
synchronized (Singleton6.class){
if (instance == null){
instance = new Singleton6();
}
}
}
return instance;
}
}
静态内部类
// 静态内部类:线程安全、延迟加载
class Singleton7{
private Singleton7(){};
public static class Inner{
private static final Singleton7 INSTANCE = new Singleton7();
}
public static synchronized Singleton7 getInstance(){
return Inner.INSTANCE;
}
}
枚举
// 枚举:线程安全,防止反序列化重新创建新的对象
enum Singleton8{
INSTANCE;
}