懒汉式

本文详细介绍了懒汉式单例模式的实现原理及Java代码实现方式,着重讲解了如何利用双重检测锁来保证线程安全的同时提高效率。

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

懒汉式:

不在类加载的时候创建对象,什么时候调用获取对象的方法,什么时候再返回该类的对象。节省空间。

为了防止多线程下创建该类的多个对象,要加锁。

我们采用的是双重检测锁:

package cn.liz.syn;

public class FullSingleTon {
	//私有化构造器
	private FullSingleTon(){
		
	}
	// 类初始化的时候不创建该类的对象
	private static FullSingleTon full = null;
	
	// 公共的获取类对象的方法
	public static FullSingleTon getInstance(){
		// 当该类的对象不存在的时候
		if(full==null){
			// 为了保证单例,加锁
			synchronized(FullSingleTon.class){
				// 双重检测
				if(full==null){
					full = new FullSingleTon(); 
				}
			}
		}
		return full;
	}
}
测试:

总结:

双重检测锁如何保证单例的呢?

首先:

1.先进行一次判断,如果已经存在,那么直接返回这个对象,避免重复等待拿锁。

2.如果不存在,那么取得锁,这个时候为了防止网络延时,应该再次判断是否存在,避免重复创建锁。

下节我们讲一个更好的实现单例的方式--静态内部类。


### C# 懒汉的实现与原理 懒汉是一种延迟初始化的方,即只有当对象第一次被请求时才会创建实。这种方能够节省内存资源,因为如果程序运行期间从未使用该实,则不会浪费任何资源来创建它。 #### 原理概述 懒汉的核心在于 **延迟加载** 和 **线程安全** 的机制。其实现通常涉及以下几个要点: - 使用私有的静态成员变量存储唯一的实。 - 提供公共的静态方法用于获取唯一实。 - 构造函数设为 `private`,防止外部通过 `new` 创建新实。 - 如果多线程环境下可能会存在多个线程同时尝试创建实的情况,因此需要引入同步以确保线程安全性[^1]。 #### 经典实现方 以下是几种常见的懒汉实现: ##### 1. 简版(不考虑线程安全) 这种实现适用于线程环境下的场景,但在多线程环境中可能导致多次实化的问题。 ```csharp public class Singleton { private static Singleton _instance; private Singleton() { } public static Singleton GetInstance() { if (_instance == null) _instance = new Singleton(); return _instance; } } ``` 此版本未处理并发情况,可能不适合复杂的生产环境[^3]。 ##### 2. 双重检查定 (Double-Checked Locking) 为了提高性能并解决线程安全问题,可以采用双重检查定技术。这种方法仅在首次创建实时执行同步操作,后续调用无需加。 ```csharp using System.Threading; public class Singleton { private volatile static Singleton _instance; // 加上volatile关键字确保可见性 private static readonly object _lock = new object(); private Singleton() { } public static Singleton GetInstance() { if (_instance == null) // 第一次检查 { lock (_lock) // 定代码块 { if (_instance == null) // 第二次检查 _instance = new Singleton(); } } return _instance; } } ``` 上述代码中,`_lock` 对象用于保护临界区,而两次 `_instance == null` 判断则减少了不必要的同步开销。 ##### 3. 使用 `Lazy<T>` 类简化实现 自 .NET Framework 4 起提供了内置支持的 `System.Lazy<T>` 泛型类,可进一步优化懒汉的实现过程。 ```csharp public class Singleton { private static Lazy<Singleton> _lazy = new Lazy<Singleton>(() => new Singleton()); private Singleton() { } public static Singleton Instance => _lazy.Value; } ``` 利用 `Lazy<T>` 不仅能自动管理线程安全性和延迟初始化逻辑,还具有更高的可读性和简洁度[^2]。 #### 总结 懒汉的主要优点是可以推迟对象的创建时间直到真正需要为止;然而其复杂之处也体现在如何妥善处理多线程条件下的竞争状态。实际开发过程中可以根据项目需求选择适合的技术方案完成相应功能扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值