Java实现创建模式-单例模式(饿汉式、懒汉式、双重检查锁、单例枚举)
内容说明
单例模式解决的问题是确保一个类只有一个实例,并提供全局访问点,以避免多个对象之间的冲突和资源浪费。这种模式通常用于管理共享资源,例如数据库连接池或线程池。
本文实现了四种不同类型的单例模式:饿汉式、懒汉式、双重检查锁和枚举
为了汇总测试,通过Main方法创建两个实例来检查它们是否是同一个对象
public class testSingleton {
public static void main(String[] args) {
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
System.out.println(s1 == s2); // true
Singleton2 s3 = Singleton2.getInstance();
Singleton2 s4 = Singleton2.getInstance();
System.out.println(s3 == s4); // true
Singleton3 s5 = Singleton3.getInstance();
Singleton3 s6 = Singleton3.getInstance();
System.out.println(s5 == s6); // true
Singleton4 s7 = Singleton4.INSTANCE;
Singleton4 s8 = Singleton4.INSTANCE;
System.out.println(s7 == s8); // true
}
}
// 饿汉式单例模式
class Singleton1 {
private static Singleton1 instance = new Singleton1();
private Singleton1() {
}
public static Singleton1 getInstance() {
return instance;
}
}
// 懒汉式单例模式
class Singleton2 {
private static Singleton2 instance;
private Singleton2() {
}
public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
// 双重检查锁单例模式
class Singleton3 {
private volatile static Singleton3 instance;
private Singleton3() {
}
public static Singleton3 getInstance() {
if (instance == null) {
synchronized (Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}
return instance;
}
}
// 枚举单例模式
enum Singleton4 {
INSTANCE;
}
饿汉模式
饿汉式初始化在类加载时创建单例类的实例。这确保了实例始终可用且线程安全,但如果实例不总是需要,则可能会浪费资源。
// 饿汉式单例模式
class Singleton1 {
private static Singleton1 instance = new Singleton1();
private Singleton1() {
}
public static Singleton1 getInstance() {
return instance;
}
}
懒汉模式
懒汉式初始化仅在需要时创建单例类的实例。这样可以节省资源,但如果没有同步,则不是线程安全的。
// 懒汉式单例模式
class Singleton2 {
private static Singleton2 instance;
private Singleton2() {
}
public static synchronized Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
双重检查锁
双重检查锁是懒汉式初始化的线程安全版本,它避免了在创建实例后的第一次同步。
// 双重检查锁单例模式
class Singleton3 {
private volatile static Singleton3 instance;
private Singleton3() {
}
public static Singleton3 getInstance() {
if (instance == null) {
synchronized (Singleton3.class) {
if (instance == null) {
instance = new Singleton3();
}
}
}
return instance;
}
}
枚举单例
枚举单例模式是一种简单的线程安全单例模式
// 枚举单例模式
enum Singleton4 {
INSTANCE;
}