1.什么单例模式?
确保一个类只有一个实例,并提供一个全局访问点,能够帮助开发者创建一个唯一的实例
2.单例模式怎么实现?
//单线程
//懒汉式,线程不安全
public class Singleton01
{
//定义一个静态变量
private static Singleton01 single;
//构造函数私有化,保证类不会被外部实例化
private Singleton01()
{
}
//定义一个静态的方法来取得类的实例
public static Singleton01 GetInstance()
{
if (single == null)
{
single = new Singleton01();
}
return single;
}
}
/// <summary>
/// 饿汉式,线程安全
/// 类加载到内存后就实例化一个单例
/// 优点:简单实用,推荐实用
/// 缺点:不管用到与否,类装载时就完成实例化
/// </summary>
public class Singleton02
{
//定义一个静态变量
private static Singleton02 single=new Singleton02();
//构造函数私有化,保证类不会被外部实例化
private Singleton02()
{
}
//定义一个静态的方法来取得类的实例
public static Singleton02 GetInstance()
{
return single;
}
}
/// <summary>
/// 双重检查锁
/// </summary>
public class Singleton03
{
//定义一个静态变量
private static Singleton03 single;
//定义一个表示确保线程同步
private static readonly Object locker = new Object();
//构造函数私有化,保证类不会被外部实例化
private Singleton03()
{
}
//定义一个静态的方法来取得类的实例
public static Singleton03 GetInstance()
{
// 当第一个线程运行到这里,此时会对locker对象“加锁”
// 当第二个线程运行该方法时,首先检测到locker对象为“加锁”状态,该线程就会挂起等待的第一个线程解锁
// lock语句运行完之后,会对该对象“解锁”
if (single == null)
{
lock (locker)
{
if (single == null)
{
single = new Singleton03();
}
}
}
return single;
}
}
3.哪些实际应用?
使用单例模式的一些具体场景包括:
-
资源共享:当一个对象需要在多个部分共享访问时,可以使用单例模式。例如,在一个多线程的应用程序中,多个线程需要访问同一个资源或共享数据,使用单例模式可以确保所有线程共享同一个实例,避免资源竞争和数据不一致的问题。
-
对象池:当创建和销毁对象的开销较大时,可以使用单例模式创建对象池。对象池维护一组已经创建好的对象,当需要使用对象时,从对象池中获取一个对象,使用完毕后归还给对象池,避免频繁的对象创建和销毁,提高性能。
-
全局访问点:当需要在应用程序的不同部分访问同一个对象时,可以使用单例模式作为全局访问点。这样可以方便地在任何地方获取该对象的实例,而不需要传递对象引用。
-
缓存:单例模式可以用于实现缓存系统。缓存可以存储频繁使用的数据,以提高系统的性能和响应时间。使用单例模式可以确保只有一个缓存对象存在,所有部分共享同一个缓存。