多线程并发下的单例模式
好久没写点东西了,感觉很对不住各位。今天有点心得正好和大家聊聊闲天。是关于单例模式在并发情况下应该怎么写才对,我还是用.net语言来说这些。
首先,我们都知道单例模式,别说你不知道。
代码如下:
public class Singleton
{
private Singleton() { }
private static Singleton instance = null;
public Singleton GetInstance()
{ return instance == null ? new Singleton() : instance; }
}
但是这个有问题了,多线程下,怎么能保证从instance == null?到new Singleton() : instance之间没有别的线程在操作呢?现在的代码明显满足不了这个情况,而这在高并发下显然是可以出现的。那就想想办法呗,例如我们使用.net中的lock来做修改。
public class Singleton
{
private Singleton() { }
private static Singleton instance = null;
private static object _lock = new object();
public Singleton GetInstance()
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{ instance = new Singleton(); }
}
}
return instance;
}
}
这样就可以实现有且仅有一次初始化的机会。
转载于:https://blog.51cto.com/realzjy/1608752