单例模式设计核心:构造器私有化 、构造器私有化、构造器私有化,重要的事情说三遍
饿汉模式
/**
* 单例模式-饿汉模式
*/
public class Hungry {
// 单例模式核心,构造器私有
private Hungry() {}
private static final Hungry HUNGRY = new Hungry();
public static Hungry getInstance() {
return HUNGRY;
}
}
class HungryTest{
public static void main(String[] args) {
Hungry instance = Hungry.getInstance();
Hungry instance1 = Hungry.getInstance();
System.out.println(instance == instance1);
}
}
// 输出
// true
懒汉模式
/**
* 单例模式-懒汉式(DCL)
*/
public class Lazy {
private Lazy() {}
private volatile static Lazy lazy;
public static Lazy getInstance () {
if (lazy == null) {
synchronized (Lazy.class) {
if (lazy == null) {
lazy = new Lazy();
/*
* 1.分配内存空间
* 2.执行构造方法,创建对象
* 3.把这个对象指向这个空间
*/
}
}
}
return lazy;
}
}
class LazyTest {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
System.out.println(Lazy.getInstance());
}).start();
}
}
}
// 输出
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
// com.yorange.pattern.single.Lazy@219a0906
静态内部类模式
/**
* 单例模式-静态内部类
*/
public class Holder {
private Holder() {}
public static Holder getInstance() {
return InnerClass.HOLDER;
}
public static class InnerClass {
private final static Holder HOLDER = new Holder();
}
}
class InnerClassTest {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
System.out.println(Holder.getInstance());
}).start();
}
}
}
// 输出
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077
//com.yorange.pattern.single.Holder@4daa077