怎么实现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单例模式的实现方式,根据实际需求选择合适的方式来实现单例模式。单例模式可以保证一个类只有一个实例,且提供了全局访问点,方便在不同的地方获取同一个实例。
本文由轻山版权所有,禁止未经同意的情况下转发
猜您想看
-
Linux下如何使用QQ
1.Linux...
2023年05月26日 -
Django数据怎么从sqlite迁移数据到MySQL
一、准备工作1...
2023年05月25日 -
如何在Edge浏览器中查看记住的密码
如何在Edge...
2023年05月13日 -
如何处理MySQL数据库中的重复记录
MySQL数据...
2023年05月05日 -
python奇怪的xpath bug举例分析
奇怪的Pyth...
2023年07月21日 -
sublime text 3如何在Ubuntu下支持中文输入
一、Ubunt...
2023年05月26日