单例(Singleton):保证只能创建一个该类的对象。
实现单例三个步骤
饿汉式: 类加载时, 对象则实例化
代码实现:
SingleTon:
public class SingleTon {
private SingleTon() {
}
private static final SingleTon INSTANCE = new SingleTon();
public static SingleTon getInstance(){
return INSTANCE;
}
}
Test:
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(() -> {
SingleTon instance = SingleTon.getInstance();
System.out.println(instance);
}).start();
}
}
}
懒汉式: 使用时创建, 线程不安全
代码实现:
public class SingleTon2 {
private SingleTon2() {
}
//volatile: 保证可见性, 有序性(禁止指令重排)
private static volatile SingleTon2 instance = null;
public static SingleTon2 getInstance() {
//DCl(Double Check Lock) 双重检测锁
if (instance == null) {
synchronized (SingleTon2.class) {
if (instance == null) {
instance = new SingleTon2();
//1 在堆中开辟空间, 所有属性值为默认值
//2 执行构造方法
//3 把地址赋值给变量
//正常 没有发生指令重排 1 2 3
//发生指令重排 1 3 2
}
}
}
return instance;
}
}
静态内部类写法: 属于懒汉式写法, 没有线程安全问题
代码实现;
public class SingleTon3 {
private SingleTon3() {
}
static class Holder {
//静态属性, 类加载时执行. 只执行一次, 没有线程安全问题
static {
System.out.println("静态内部类加载了");
}
private static final SingleTon3 INSTANCE = new SingleTon3();
}
public static SingleTon3 getInstance() {
return Holder.INSTANCE;
}
}