怎么实现Java单例模式
实现Java单例模式是指确保一个类只有一个实例,并提供一个全局访问点来获取该实例。在Java中,常见的实现方式有饿汉式和懒汉式。
1. 饿汉式单例模式
饿汉式是指在类加载的时候就创建了实例对象,并且对外提供获取该实例的方法。具体实现如下:
1.1 使用静态常量实现饿汉式单例
在类加载的时候就创建了实例对象,并使用静态常量来保存对象的引用。
public class Singleton {
// 私有构造方法,禁止外部直接创建
private Singleton() {
}
// 创建类的唯一实例并保存在静态常量中
public static final Singleton INSTANCE = new Singleton();
// 对外提供获取实例的方法
public static Singleton getInstance() {
return INSTANCE;
}
}
该实现方式在类加载的时候就创建了实例对象,保证了线程安全性。
1.2 使用静态代码块实现饿汉式单例
与静态常量方式类似,使用静态代码块在类加载的时候创建实例对象。
public class Singleton {
// 私有构造方法,禁止外部直接创建
private Singleton() {
}
// 创建类的唯一实例并保存在静态变量中
private static Singleton INSTANCE;
static {
INSTANCE = new Singleton();
}
// 对外提供获取实例的方法
public static Singleton getInstance() {
return INSTANCE;
}
}
该实现方式同样在类加载的时候就创建了实例对象,保证了线程安全性。
2. 懒汉式单例模式
懒汉式是指在需要获取实例对象的时候才进行创建,在没有使用到的时候不创建。具体实现如下:
2.1 线程不安全的懒汉式单例
简单粗暴的实现方式,使用静态变量保存实例对象,在需要的时候进行创建。
public class Singleton {
// 私有构造方法,禁止外部直接创建
private Singleton() {
}
// 创建类的唯一实例
private static Singleton INSTANCE;
// 对外提供获取实例的方法
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
该实现方式在多线程环境下可能会创建多个实例对象,因此线程不安全。
2.2 线程安全的懒汉式单例(使用双重检查锁)
为了保证线程安全,可以在创建实例对象时添加同步锁来避免多线程创建多个实例的问题。
public class Singleton {
// 私有构造方法,禁止外部直接创建
private Singleton() {
}
// 创建类的唯一实例
private static volatile Singleton INSTANCE;
// 对外提供获取实例的方法
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
该实现方式通过双重检查锁的方式,在保证线程安全的前提下,延迟加载实例对象。
3. 使用静态内部类实现单例模式
通过静态内部类的方式可以实现懒加载且线程安全的单例模式实现方式。
3.1 静态内部类实现单例
public class Singleton {
// 私有构造方法,禁止外部直接创建
private Singleton() {
}
// 静态内部类
private static class SingletonHolder {
// 创建类的唯一实例并保存
private static final Singleton INSTANCE = new Singleton();
}
// 对外提供获取实例的方法
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
该实现方式在类加载的时候不会创建实例对象,只有在调用getInstance()方法时才会加载静态内部类并创建实例对象。
以上是常见的几种Java单例模式的实现方式,根据实际需求选择合适的方式来实现单例模式。单例模式可以保证一个类只有一个实例,且提供了全局访问点,方便在不同的地方获取同一个实例。
本文由轻山版权所有,禁止未经同意的情况下转发
猜您想看
-
如何用python实现破解zip压缩包程序
1. 导入所需...
2023年07月23日 -
C++中怎么保证析构函数不抛出异常
1. 析构函数...
2023年07月22日 -
Linux上的cron任务管理
1、什么是cr...
2023年05月15日 -
游戏在CS:GO中进行中会突然退出,这是怎么回事?
CS:GO中游...
2023年04月17日 -
怎么使用Elasticsearch中的Span Query
Elastic...
2023年07月21日 -
C++中为什么尽量不增加函数的参数个数
1. 增加函数...
2023年05月22日