[英]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,您不再需要以依赖于平台的方式执行此类操作。 非常适合单例初始化。
看起来似乎很明显,但是如果您有多个进程,则可以有多ole单例实例。 我更像是一个Java专家,但是如果您有与ClassLoader等效的东西,那么您可以再次拥有多个单例。 基本上,您可以拥有与控制实例化的实体一样多的单例(在这里谈论工厂模式)
在OS X上,不同动态库中的静态对象将是不同的实例。 在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%的单身人士都使用这种模式:)
好的,这是可能的。 在接口上,您有单身……但是在实现中,出于某种原因选择了多个实例。
面试问题通常会尝试测试您对某个主题的知识,并且通常会对他们有一些窍门。 我认为在这种情况下,答案是这样的:如果该类有一个以上的实例,那么它不是单例模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.