单例模式(Singleton Pattern)是一种设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在Java中,我们可以使用以下几种方式来实现单例模式:
1、饿汉式单例模式(线程安全)在这种方式下,实例在类加载时就被创建,因此它不会延迟初始化。这种方式的单例模式是线程安全的,因为实例在类加载时就被创建,所以在多线程环境下也不会引起并发问题。
public class Singleton {
private static Singleton instance = new Singleton(); private Singleton() {}
public static Singleton getInstance() {
return instance;
}}
2、懒汉式单例模式(线程不安全)在这种方式下,实例只有在第一次调用getInstance()方法时才会被创建,因此它延迟了初始化。但是这种方式的单例模式在多线程环境下是不安全的,因为多个线程可能同时进入getInstance()方法,导致创建多个实例。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}}
3、懒汉式单例模式(线程安全,使用双重检查锁定)这种方式的单例模式解决了懒汉式单例模式在多线程环境下的问题。它通过使用volatile关键字和双重检查锁定机制,确保在多线程环境下只创建一个实例。但是这种方式在Java 9及以后版本中可能会失效。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}}
4、静态内部类单例模式(线程安全,延迟初始化)这种方式的单例模式结合了饿汉式单例模式和懒汉式单例模式的优点。它使用静态内部类来实现延迟初始化,并且在多线程环境下是线程安全的。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}}