书里提供的一段Double-Checked Locking Pattern的示例代码,我觉得是错误的。大家帮忙看看
老毕 2006-08-03 09:40:17 最近我在阅读一本关于Design Pattern的英文书。在介绍由Singleton pattern变形获得的Double-Checked Locking Pattern时,书中提供了如下的C++代码:
-------------------------
这是Singleton的示例:
-------------------------
Class USTax
{
public:
static USTax* getlnstance();
private:
USTax();
static USTax* instance;
}
USTax::USTax ()
{
instance = 0;
}
USTax* USTax::getlnstance ()
{
if (instance == 0)
instance = new USTax;
return instance;
}
-------------------------------------------------
这是Double-Checked Locking Pattern的示例:
-------------------------------------------------
class USTax : public CalcTax
{
public:
static USTax* getlnstance();
private:
USTax();
static USTax* instance;
};
USTax::USTax ()
{
instance = 0;
}
USTax* USTax::getlnstance ()
{
if (instance == 0)
{
// do sync here
if (instance == 0)
{
}
}
return instance;
}
---------------------------
我的问题:
---------------------------
1. 上面的两段示例代码中USTax()的Constructor是不是没有意义的?是否应修改为对类的private static成员instance的初始化?即:
USTax* USTax::instance == 0;
2. 在DCLP的getInstance()方法中,第二个if语句是否应该修改为:
if (instance == null)
instance = new USTax;
--------------------------
相关说明:
--------------------------
在网上找了许多关于DCLP的文章,大多是Java的,文中均提到在Java中若按如上方式实现是不能真正实现线程安全的。而仅有的几篇由C++实现的文章却没有太多的讨论。