单例模式详解
2023-12-20 20:39:02
单例模式
1. 概述
单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点以获取该实例。这种模式有助于控制资源的访问、管理全局配置或共享状态,确保系统中某个类只存在一个实例。
2. 目的
确保一个类仅有一个实例,且提供全局访问点,以便其他类可以轻松访问该实例。
3. 实现方式
3.1 懒汉式单例(Lazy Initialization)
懒汉式单例通过延迟实例化的方式,在第一次使用时才创建实例。这通常通过加锁来保证在多线程环境下只创建一个实例。
public class Singleton
{
? private static Singleton instance;
? private static readonly object lockObject = new object();
?
? private Singleton() { }
?
? public static Singleton Instance
? {
? ? ? get
? ? ? {
? ? ? ? ? lock (lockObject)
? ? ? ? ? {
? ? ? ? ? ? ? if (instance == null)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? instance = new Singleton();
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? ? return instance;
? ? ? }
? }
}
优点:
-
延迟加载,节省资源。
缺点:
-
多线程环境下可能会创建多个实例,需要使用锁机制保证线程安全。
3.2 饿汉式单例(Eager Initialization)
饿汉式单例在类加载时就创建实例,保证在任何线程访问之前已经存在一个实例。
public class Singleton
{
? private static readonly Singleton instance = new Singleton();
?
? private Singleton() { }
?
? public static Singleton Instance
? {
? ? ? get { return instance; }
? }
}
优点:
-
在程序启动时就进行实例化,线程安全。
缺点:
-
可能在程序启动时就占用资源。
3.3 双检锁/双重校验锁(Double-Checked Locking)
双检锁单例在检查实例是否存在时使用了两次检查,一次在没有锁的情况下,另一次在加锁的情况下。
public class Singleton
{
? private static Singleton instance;
? private static readonly object lockObject = new object();
?
? private Singleton() { }
?
? public static Singleton Instance
? {
? ? ? get
? ? ? {
? ? ? ? ? if (instance == null)
? ? ? ? ? {
? ? ? ? ? ? ? lock (lockObject)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? if (instance == null)
? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? instance = new Singleton();
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? ? return instance;
? ? ? }
? }
}
优点:
-
在实例为 null 的情况下才进行加锁,提高性能。
缺点:
-
需要考虑多线程情况下的双检查,确保线程安全。
3.4 静态初始化单例
静态初始化单例通过静态构造函数在类加载时完成实例化。
public class Singleton
{
? // 使用静态 readonly 字段确保线程安全的初始化
? private static readonly Singleton instance;
?
? // 私有构造函数,防止外部直接实例化
? private Singleton() { }
?
? // 静态构造函数用于初始化实例
? static Singleton()
? {
? ? ? instance = new Singleton();
? }
?
? // 全局访问点
? public static Singleton Instance
? {
? ? ? get { return instance; }
? }
}
优点:
-
利用静态初始化的线程安全特性,保证了只有一个实例。
缺点:
-
无法进行延迟加载,可能在程序启动时就占用资源。
4. 选择单例模式的需求和场景
选择单例模式的实现方式取决于具体的需求和应用场景。懒汉式和饿汉式适用于不同的情况,而双检锁和静态初始化单例则是对性能和资源占用的一些折中选择。在多线程环境下,需要特别注意实现的线程安全性,可以使用锁机制或者其他线程安全的方式来保证单例的唯一性。选择合适的单例模式实现,可以在系统中提供高效且唯一的实例。
文章来源:https://blog.csdn.net/weixin_66598341/article/details/135115454
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!