在什么情况下,单例设计模式可能会生成同一单例类的多个实例
In what cases, a singleton design pattern may generate multiple instances of the same singleton class?
这是一个面试问题。
在C++中,对于单例设计模式,是否可能存在类的多个实例?如果是,在什么情况下?
我的想法:
在多线程的情况下,如果没有同步保护,我们可能会有多个实例由多个线程生成。
我们可以使用互斥来进行保护。例如,使用互斥锁来保护全局变量作为计数器来保留实例数,以确保只有一个实例。
有更好的主意吗?
在C++11中,有一个新的功能可以使一次性初始化变得可靠-std::call_once
。你可以在这里找到一个很好的参考资料。如果你使用的编译器支持C++11,这将为你提供一种很好的独立于平台的标准方法
在依赖于平台的级别,大多数操作系统都提供了一种只进行一次初始化的方法。例如,在iOS或OS X中,您可以使用Grand Central Dispatch的dispatch_once
。在Windows上,Vista和更高版本中提供了一次性初始化API。
当你没有标准的替代方案时,这些很好,但多亏了C++11,你不再需要以依赖于平台的方式做那种事情。它非常适合单例初始化。
这可能看起来很明显,但如果您有多个进程,则可以有多极单例实例。我更喜欢java,但如果你有任何与ClassLoader等价的东西,那么你可以再次拥有多个singleton。基本上,您可以拥有与控制实例化的实体一样多的singleton(在这里谈论工厂模式)
在OSX上,不同动态库中的静态对象将是不同的实例。在Windows和Linux上,它们将按预期运行。
在不同平台的进程中拥有唯一静态对象的唯一保证方法是在导出的函数中使用静态局部变量习惯用法,也就是说,而不是这样做:
foo.h
static Foo* global_instance;
foo.cpp
static Foo* global_instance = new Foo();
你需要这样做:
foo.h
Foo* get_global_instance();
foo.cpp
Foo* get_global_instance() {
static Foo instance;
return &instance;
}
显而易见的答案是:这取决于实现,但如果存在多个实例的可能性,实现是破碎的所以这个问题实际上是因为:你会犯什么样的错误实现单例时生成?(答案是:漂亮与实现任何模式时可能出现的错误几乎相同。)
检查双重检查锁定单例模式的问题。这个问题在互联网上流传了很多次。但是我一生中见过的99%的单身汉都使用这种模式:)
好的,这是可能的。在接口上,您有singleton。。。但是在实现中出于任何原因选择了具有多个实例。。也许是联营?
面试问题通常试图测试你对某个主题的了解,通常会有一些技巧。我认为在这种情况下,答案是这样的:如果这个类有不止一个实例,那么它就不是单例模式。
- C++ 实现模板单例类时出现链接错误
- 具有非默认构造函数的单例类
- 单例类析构函数无法清理 (SDL_Quit) MinGW
- 如何在单例类中管理变量状态?
- 访问单例类C++时出现问题
- 基于 IOKit 的 kext 驱动程序中的单例类
- 指向抽象模板单例类的指针向量C++?
- C++在单例类中创建类实例时遇到困难
- 如果我这样写,我的单例类会导致什么错误
- 这是一个有效的单例类吗?
- 函数内具有静态变量的单例类(迈耶实现)
- 继承的模板化单例类 c++ 中未定义的构造函数
- 为什么调用单例类 Qt 消息处理程序成员函数会出现错误:缺少参数列表
- C++:单例类设计(错误:未解析的外部符号)
- 构造函数在不同线程中的静态单例类上调用两次
- 如何在自定义单例类中使用log4cplus
- 为什么在C 中创建单例类创建期间静态函数参考静态变量
- c++单例类实例访问整个应用程序
- 在什么情况下,单例设计模式可能会生成同一单例类的多个实例
- 无法从其他类获取单例类的实例