1. 饿汉式
/**
* @author :fan
* @description: 饿汉式
* @date :2020/10/1 12:16
*/
public class Singleton {
//让构造函数为 private,这样该类就不会被实例化
private Singleton() {
}
//创建不可变静态变量
private static Singleton instance = new Singleton();
//提供公有静态方法,返回实例对象,获取唯一可用的对象
public static Singleton getInstance() {
return instance;
}
public static void main(String[] args) {
//不合法的构造函数
//编译时错误:构造函数 SingleObject() 是不可见的
//SingleObject object = new SingleObject();
//获取唯一可用的对象
Singleton object = Singleton.getInstance();
}
}
2. 懒汉式(双重检查)
/**
* @author :fan
* @description: 双重检查,懒汉式加载,兼顾线程安全与性能
* @date :2020/10/1 12:43
*/
//双重检查,懒汉式加载,兼顾线程安全与性能
public class Singleton2 {
//声明静态变量,使用 关键字修饰,防止指令重排序
private static volatile Singleton2 instance;
//构造方法私有化,防止实例对象
private Singleton2() {
}
//创建获取方法
// 多线程环境下执行getInstance()时先判断单例对象是否已经初始化,如果已经初始化,就直接返回单例对象,
// 如果未初始化,就在同步代码块中先进行初始化,然后返回,效率很高。
public static Singleton2 getInstance() {
//双重检查判断
if (instance == null) {//主要为了兼顾性能,避免多线程排队
//同步代码块创建
synchronized (Singleton2.class) {
if (instance == null) {
instance = new Singleton2();
}
}
}
return instance;
}
}