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

Chr*_*ris 2 c# locking

在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));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ert 8

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

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

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

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

Joe的代码在这里:

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

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

  • "像乔一样的人",你的意思是"微软员工"吗?是的,我们支付我们的员工 - 比如乔 - 来编写代码.:-) (3认同)