程序员的自我修养里有这么一段程序,作者认为这里的双重if可以使lock的调用开销最小。

volatile T* p=0;
T*GetInstance()
{
if(p==NULL)
{
    lock();
    if(p==NULL) p=new T;
    unlock();
}
return p;
}

第一个if显然是必要的,但对于第二个if,到底有没有必要,第一反应确实是有些奇怪。

经过google发现原因如下:

假设有两个线程A和B,当A调用GetInstance执行到第一个if时,P为空,在执行lock之前,A有可能被CPU临时挂起,假如没有第二个if,则进程B运行到同样位置之后,会lock并且创建对象,然后unlock,当进程A再次被执行的时候,就会重复创建T,而如果有第二个if,则A进程二次执行的时候,发现p不为空,就会直接unlock并且返回。

posted on 2012-10-18 20:23  Zaiping  阅读(493)  评论(0编辑  收藏  举报