3

在我们工作的数据访问层中,我们有这个标准实现,其中类是通过一个看起来像这样的单例公共属性访问的:

public static CustomerController Instance
        {
            get 
            {
                lock(singletonLock)
                {
                    if( _instance == null )
                    {
                        _instance = new CustomerController();  
                    }
                    return _instance;
                }
            }
        }

现在,我知道代码在做什么,但我想知道为什么你会在每次使用它时只创建一个类的实例?

4

3 回答 3

2

编辑:哦,哎呀,我没有抓住“数据访问层”部分。但我也有一个例子:如果你的多线程应用程序通过一个单例类汇集所有的数据库调用,那么只有一个线程会一次访问数据库,避免竞争条件。

如果您在多线程应用程序中有一个日志机制,用于吐出所有异常并仅写入信息(特别是对于始终运行的服务或应用程序,每当发生事情时打印出状态),您将遇到文件- 锁定问题。我使用单例记录器类,因此只有一个线程可以访问记录器,其余线程将等到记录器有空将它们的行写入文本文件。

使用单例有很多很酷的理由,但我和你一样,不知道它们是什么,直到我在多线程应用程序中遇到文件访问这个问题。

于 2008-10-31T01:04:40.643 回答
1

您可能也希望这样做,它的双重检查锁定,它将加快访问您的单例

 public static CustomerController Instance
        {
                get 
                {
                        if( _instance == null )
                        {
                           lock(singletonLock)
                           {
                                if( _instance == null )
                                {
                                        _instance = new CustomerController();  
                                }

                            }
                        }   
                        return _instance;
                }
        }
于 2008-10-31T01:32:50.870 回答
1

答案很简单:您希望每次使用时都获得相同的对象。

它为您提供了作为全局变量(即只有一个)的优点和作为类对象的优点(除其他外,它可以在第一次需要时进行不可见的初始化)。

于 2008-10-31T02:26:31.620 回答