《单例模式》
自己复习用,懒得粘大段代码,我嫌占地,你懒得看,代码篇幅多会直接放源码链接。
单例思想
保证对象的唯一,好处也是可以严格控制客户端对对象的访问。
代码示例
1.Unity可以不用考虑线程问题,一般代码可以如下:
public class Singleton
{
private static Singleton _instance;
private Singleton()
{
}
public static Singleton GetSingleton()
{
if (_instance==null)
{
_instance = new Singleton();
}
return _instance;
}
}
单例模式为了保证类的唯一实例是通过判断为null后在进行实例,需要将构造函数私有化,这是单例模式的重点所在。有次面试笔试题手写单例模式,感觉简单的一比还加了锁,面试官提了一下私有化构造函数我还疑惑私有构造函数还怎么实例化。。。。最后直言没学过单例模式【尴尬.jpg】。
2.多线程单例模式
public class Singleton
{
private static Singleton _instance;
private static readonly object o = new object();
private Singleton()
{
}
public static Singleton GetSingleton()
{
lock (o)
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
这是在多线程编程环境下,避免多个线程同时访问Singleton类,调用GetSingleton()方法创建对个实例,加锁确保 一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,它就会一直等待。 但是每次访问函数都会加锁会影响性能,下面修改为双重锁定
3.双重锁定
public static Singleton GetSingleton()
{
if (_instance==null)
{
lock (o)
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
第一个判断null,是判断_instance字段是否为空,如果已经实例化类了,直接返回。如果为空的话,进入if加锁,如果有两个线程同时进入这个锁主要阻挡多余线程,锁内的if判断避免第一个线程已经实例化了,第二个线程创建新的实例。