我们都知道,网站对于一些常用数据做缓存,会加速网站访问,像下面这样:

public string GetFoo()
{
    if ( cache.get("Foo") == null )
    {
        cache.set("Foo", GetFooFromDb());
    }
    return cache.get("Foo");
}

上面的方法如果GetFooFromDb()的开销很小或者运行时间很短,则影响不大,无非就是高并发的时候多执行几次GetFooFromDb()和设置缓存的值,但是如果GetFooFromDb()开销很大或者运行时间很长,或者是很多数据缓存的集合,则需要保证GetFooFromDb()方法只被执行一次:

private static object GetFooLock = new object();

public string GetFoo()
{
    if ( cache.get("Foo") == null )
    {
        lock(GetFooLock)
        {
            if ( cache.get("Foo") == null )
            {
                cache.set("Foo", GetFooFromDb());                
            }
        }
    }
    return cache.get("Foo");
}