单例模式的通常模式是这样的:
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
然而,据我所知,该解决方案不是线程安全的,因为1)Foo的构造函数可能会被调用多次(这可能重要,也可能不重要),2)实例(inst)在返回给不同的线程之前可能尚未完全构造。
一种解决方法是在整个方法周围包装一个互斥锁(mutex),但这样做会导致我在实际需要之后长时间支付同步开销。另一种解决方法是类似于:
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
{
pthread_mutex_lock(&mutex);
if(inst == NULL)
inst = new Foo(...);
pthread_mutex_unlock(&mutex);
}
return *inst;
}
这样做是正确的吗?还有什么需要我注意的问题吗?例如,是否会出现静态初始化顺序问题,即在调用getInst的第一次inst始终保证为NULL吗?