单例模式

本文介绍了单例模式的概念及其应用场景,特别是在资源管理方面的作用。详细解释了两种常用的单例模式实现方式:双重检查锁定(DCL)和静态内部类。探讨了这两种方法的特点及适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式是应用最广的模式之一。在应用中,对于很耗资源的对象,比如线程池,缓存系统等,没有理由让它构造多个实例,只需要拥有一个全局对象。单例模式保证只有一个实例存在。

确保某个类只有一个对象的场景,避免产生多个对象消耗过多资源或一个对象需要消耗的资源过多,比如访问IO和数据库等资源

单例模式UML图:

单例模式的实现方法有多种,其中有些存在同步或者效率问题,推荐以下两种实现方法:

1.DCL:能够在需要时进行初始化,又能保证线程安全,并且单例对象初始化后调用getInstance不进行同步锁。但老版本JDK存在内存模型的问题,所以不要在JDK1.5以及之后的版本,需要加上volatile来确保对象每次都从内存中读取

public class Singleton{
	private static Singleton sInstance = null;
	private Singleton(){
	}
	public static Signleton getInstance(){
		if(sInstance == null){
			synchronized (Singleton.class){
				if(sInstance == null){
					sInstance = new Singleton();
				}
			}
		}
		return sInstance;
	}
}
2.静态内部类:DCL存在某些极个别情况下会出现失效问题,因此需要采用静态内部类方法。第一次加载Singleton类时不会初始化sInstance,只有第一次调用getInstance方法才会导致虚拟机加载SingletonHolder类。

public class Singleton{
	private Singleton(){
	}
	public static Singleton getInstance(){
		return SingletonHolder.sInstance;
	}
	private static class SingletonHolder{
		private static final Singleton sInstance = new Singleton();
	}
}

3.C++11标准保证了本地静态变量只会初始化一次

public class Singleton{
	public:
		static Singleton& instance(){
			static Singleton *instance = new Singleton();
			return *instance;
		}
	private:
		Singleton(){
		}
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值