1. 饿汉式
饿汉式是最简单的实现单例模式的方法之一。在程序启动时就创建实例对象,并且始终只创建一个实例,在需要使用该实例时直接返回即可。
public class Singleton
{
private static Singleton instance = new Singleton();
private Singleton() { }
public static Singleton Instance
{
get { return instance; }
}
}
2. 懒汉式(非线程安全)
懒汉式是在需要使用实例对象时才创建的方式,这种方式在多线程环境下是不安全的,可能会创建多个实例。
public class Singleton
{
private static Singleton instance;
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
3. 懒汉式(线程安全)
为了解决懒汉式的线程安全问题,可以使用加锁的方式确保只有一个线程可以创建实例。
public class Singleton
{
private static Singleton instance;
private static readonly object lockObj = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
lock (lockObj)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}
}
4. 双重锁定
双重锁定是懒汉式的一种优化方式,通过先判断实例是否已经创建,避免了每次获取实例都需要加锁的性能损耗。
public class Singleton
{
private static Singleton instance;
private static readonly object lockObj = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (lockObj)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
5. 延迟初始化
延迟初始化是懒汉式的一种改进方法,使用Lazy类来延迟实例的创建,可以在需要使用实例时再进行初始化。
public class Singleton
{
private static readonly Lazy lazyInstance =
new Lazy(() => new Singleton());
private Singleton() { }
public static Singleton Instance
{
get { return lazyInstance.Value; }
}
}
6. 使用静态构造函数
使用静态构造函数是一种更加简洁的实现单例模式的方式,静态构造函数在整个生命周期中只会执行一次,可以保证只创建一个实例。
public class Singleton
{
private static readonly Singleton instance = new Singleton();
static Singleton() { }
private Singleton() { }
public static Singleton Instance
{
get { return instance; }
}
}
上述是C#实现单例模式的六种方法的小结。其中饿汉式和静态构造函数可以保证线程安全,其他方法需要在多线程环境下额外进行安全措施。根据实际需求和性能要求,选择合适的单例模式实现方式。