在我们的数据访问层工作中,我们有这个标准实现,其中通过单独的公共属性访问类,如下所示:
public static CustomerController Instance
{
get
{
lock(singletonLock)
{
if( _instance == null )
{
_instance = new CustomerController();
}
return _instance;
}
}
}
现在,我得到了代码正在做的事情,但我想知道为什么每次使用它时只创建一个类的实例就会这样做?
答案 0 :(得分:2)
编辑:哦,哎呀我没有抓住“数据访问层”部分。但我也有一个例子:如果您的多线程应用程序通过单例类漏斗所有的数据库调用,则只有一个线程会一次访问数据库,从而避免竞争条件。
如果您在多线程应用程序中有一个日志记录机制,用于吐出所有异常并只写入信息(特别是对于服务或始终运行的应用程序,在发生事件时打印出状态),您将遇到文件锁定问题。我使用单例记录器类,因此只有一个线程可以访问Logger,其余的将等到Logger可以自由地在文本文件中写入它们。
使用单例有很多很酷的理由,但在我遇到多线程应用程序中的文件访问问题之前,我就像你一样,不知道它们是什么。
答案 1 :(得分:1)
您也可以这样做,双重检查锁定,它将加快您对单身人士的访问
public static CustomerController Instance
{
get
{
if( _instance == null )
{
lock(singletonLock)
{
if( _instance == null )
{
_instance = new CustomerController();
}
}
}
return _instance;
}
}
答案 2 :(得分:1)
答案很简单:你想在每次使用时获得相同的对象。
它为您提供了作为全局变量(即只有一个)的优势,具有作为类对象的优点(除其他外,它可以在第一次需要时进行无形初始化)。