繁体   English   中英

如何使双重检查锁定语法更简洁?

[英]How do I make double-checked locking syntax less verbose?

在C#中,我有一个非常详细的语法,用于从数据库中提取一个简单的项目列表:

if (malls == null)
{
    lock (_lock)
    {
        if (malls == null)
        {
            using (var session = NhibernateHelper.OpenSession())
            {
                malls = session.CreateCriteria<Mall>()
                    .AddOrder(Order.Asc("Name")).List<Mall>();

                CacheManager.Set(CACHE_KEY, malls, TimeSpan.FromMinutes(CACHE_DURATION));
            }
        }
    }
}

我知道双重检查锁定的好处,我强烈支持它的使用,但它看起来非常冗长。 你能推荐一些可能会清理它的语法快捷方式或样式吗?

大概你正在使用双重检查锁定,因为你有一个资源,你想以懒惰,线程安全的方式初始化。

双重检查锁定是实现这一目标的一种机制 ,但正如您已经正确指出的那样,该机制的详细程度彻底破坏了代码的含义。

当你有一个模糊含义的机制时,通过创建一个抽象来隐藏机制 一种方法是创建一个“懒惰线程安全实例化”类并将一个委托传递给它,它以懒惰的线程安全方式完成你想要的操作。

但是,有一种更好的方法。 更好的方法是不要自己做这项工作,而是让一位世界级的线程专家为你做这件事。 这样你就不用担心做对了。 Joe Duffy不得不担心做对。 正如Joe明智地说的那样,不是在整个地方重复锁定机制,而是编写一次然后使用抽象。

Joe的代码在这里:

http://www.bluebytesoftware.com/blog/PermaLink,guid,a2787ef6-ade6-4818-846a-2b2fd8bb752b.aspx

此代码的变体将在基类库的下一个版本中提供。

要减少噪音,你可以这样做:

public List<Mall> Malls()
{
    EnsureMallsInitialized();
    return malls;
}

private void EnsureMallsInitialized()
{
    if (malls == null) // not set
    lock (_lock)       // get lock
    if (malls == null) // still not set
    {
        InitializeMalls();
    }        
}

private void InitializeMalls()
{
    using (var session = NhibernateHelper.OpenSession())
    {
        malls = session.CreateCriteria<Mall>()
            .AddOrder(Order.Asc("Name")).List<Mall>();

        CacheManager.Set(CACHE_KEY, malls, TimeSpan.FromMinutes(CACHE_DURATION));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM