//懒汉式
public class Singleton1 {
// 被引用时再初始化
private static Singleton1 instance;
// 构造方法私有化
private Singleton1(){}
public static Singleton1 getSingleton() {
if(instance == null) {
instance = new Singleton1();
}
return instance;
}
}
//饿汉式
public class Singleton2 {
private static final Singleton2 instance = new Singleton2();
// 构造方法私有化
private Singleton2(){}
public static Singleton2 getSingleton() {
return instance;
}
}
//全局锁:线程安全
public class Singleton3 {
private static Singleton3 instance;
// 构造方法私有化
private Singleton3(){}
// 获取单例的方法
public synchronized static Singleton3 getSingleton() {
if(instance == null) {
instance = new Singleton3();
}
return instance;
}
}
//静态代码块方式
public class Singleton4 {
private static Singleton4 instance;
// 静态代码块执行,属于线程安全
static {
instance = new Singleton4();
}
// 构造方法私有化
private Singleton4(){
System.out.println("Singleton4的构造方法被执行");
}
// 获取单例的方法
public static Singleton4 getSingleton() {
return instance;
}
}
//双重校验模式
public class Singleton5 {
private static Singleton5 instance;
// 构造方法私有化
private Singleton5(){}
// 获取单例的方法
public synchronized static Singleton5 getSingleton() {
// 第一重校验
if(instance == null) {
synchronized (Singleton5.class) {
// 第二重校验
if(instance == null) {
instance = new Singleton5();
}
}
}
return instance;
}
}
//内部类方式
public class Singleton6 {
// 构造方法私有化
private Singleton6(){}
// 静态内部类
private static class SingletonHolder{
// 在内部类中,创建单例对象
private static final Singleton6 instance = new Singleton6();
}
public static Singleton6 getSingleton() {
//通过内部类获取单例对象
//首先加载内部类(线程安全)
return Singleton6.SingletonHolder.instance;
}
}
//内部类方式
public class Singleton7 {
// 构造方法私有化
private Singleton7(){}
// 内部枚举类
enum SingletonEnum{
INSTANCE;
//单例对象
private Singleton7 instance;
private SingletonEnum() {
instance = new Singleton7();
}
}
//获取单例的方法
public static Singleton7 getSingleton() {
return SingletonEnum.INSTANCE.instance;
}
}