目的:保证当前程序中只有一个实例。
问题:为什么不直接使用静态类?
与只能具有静态对象的静态类不同,单例类可以同时具有静态和非静态对象。因此,从内存管理的角度来看,当您使用单例类时,可以利用垃圾回收管理对象
具体比较可以参考一下博客
C#中的单例类与静态类_zls365365的博客-CSDN博客
https://www.jb51.net/article/203753.htm
优点:单例类只有一个实例,节省了内存资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能;单例模式可以在系统设置全局的访问点,优化和共享数据。
C#推荐实现:
注意点:线程安全,资源消耗。
关于指令重排和锁的问题:CPU和主内存之间存在CPU缓存寄存器,确保数据更新和读取同步。
JVM之指令重排分析_bladestone的博客-CSDN博客_指令重排
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();
}