【单例模式】
单例模式是一种最简单的设计模式之一,属于创建型模型,它提供了一种创建对象的最佳方式。单例模式涉及到一个单一的类,只有一个实例存在,同时提供能对该实例加以访问的全局访问方法
【介绍】
-
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点
-
主要解决:一个全局使用的类频繁地创建与销毁
-
如果解决:判断系统是否已经有这个单例,如果有返回,没有创建
-
关键代码:构造函数是私有的
-
优点:1、在内存里只有一个实例,减少了内存的消耗。2、避免了对资源的多重占用
-
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化
-
使用场景:1、要求生产唯一序列号。2、WEB计数器,不用每次刷新都在数据库里加一次,用单例缓存。3、创建一个对象需要消耗的资源过多
-
注意事项:Getinstance()方法中需要使用同步锁Synchronized(singleton.class)防止多线程同时进入造成多次实例化
【实现】
多重锁定:
class Singleton
{
private static Singleton instance;
//在第一引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化
private static object syncRoot = new object();//程序运行时创建一个静态只读的进程辅助对象
private Singleton ()
{
//构造方法,让其private,堵死了外界利用new创建此类实例的可能
}
public static Singleton GetSingleton()
{
if (instance == null)//双重锁定。先判断实例是否存在,不存在再加锁处理
{
lock (syncRoot)//单线程
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}
静态化初始
public sealed class Singleton//阻止发生派生,而派生可能会增加实例
{
private static readonly Singleton instance = new Singleton();
//在第一引用类的任何成员时创建实例,公共语言运行库负责处理变量初始化
private static readonly object syncRoot = new object();//程序运行时创建一个静态只读的进程辅助对象
private Singleton ()
{
//构造方法,让其private,堵死了外界利用new创建此类实例的可能
}
public static Singleton GetSingleton()
{
return instance;
}
}
【总结】
-
懒汉式单例
1、lock是确保当一个线程位于代码临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它一直等待(被阻止),直到该对象被释放
2、第一次被引用,才会将自己实例化,多线程访问的安全性,多重锁定保证安全
-
懒汉式单例
静态初始化方式是在自己被加载时就将自己实例化,提前占用系统资源