C# 设计模式 1-1 单例模式反思

目的:保证当前程序中只有一个实例。

问题:为什么不直接使用静态类?

与只能具有静态对象的静态类不同,单例类可以同时具有静态和非静态对象。因此,从内存管理的角度来看,当您使用单例类时,可以利用垃圾回收管理对象

具体比较可以参考一下博客

C#中的单例类与静态类_zls365365的博客-CSDN博客

https://www.jb51.net/article/203753.htm

优点:单例类只有一个实例,节省了内存资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能;单例模式可以在系统设置全局的访问点,优化和共享数据。

C#推荐实现:

注意点:线程安全,资源消耗。

关于指令重排和锁的问题:CPU和主内存之间存在CPU缓存寄存器,确保数据更新和读取同步。

JVM之指令重排分析_bladestone的博客-CSDN博客_指令重排

c#中volatile关键字的作用 | 学步园

C语言中volatile关键字的作用_AllenSun-1990的博客-CSDN博客_c# volatile关键字的作用

Memory Barriers Are Like Source Control Operations

Countermeasures of Java instruction reordering in multithreading environment

    /// <summary>
    /// 双重检查懒汉式
    /// </summary>
    public class Singleton {
        //volatile + lock防止指令重排
        private static volatile Singleton instance;
        private readonly static object lockHelp;
        private Singleton() { }
        public static Singleton getInstance() {
            //外部null作用,每个线程访问都要进行同步,而这个方法只执行一次实例化代码就够了
            //每次都同步方法显示效率低下。
            if (instance == null) 
                // 资源竞争
                lock (lockHelp)
                    // null防止多个线程多次执行实例化操作
                    if (instance == null) 
                        instance = new Singleton();
            return instance;
        }
    }
    /// <summary>
    /// 静态内部类
    /// </summary>
    public class Singleton {
        private Singleton() { }
        private static class SingletonInstance {
           internal static readonly Singleton INSTANCE = new Singleton();
        }
        public static Singleton getInstance() {
            return SingletonInstance.INSTANCE;
        }
    }
    /// <summary>
    /// 静态属性
    /// </summary>
    public sealed class Singleton {
        private Singleton() { }
        public static readonly Singleton Intance = new Singleton();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值