锁(锁)和锁(variable_which_I_am_using)之间的区别
收藏

我正在使用C#和.NEt 3.5。 OptionS和Option有什么区别?

class MyClass
{
    private object m_Locker = new object();
    private Dicionary<string, object> m_Hash = new Dictionary<string, object>();

    public void OptionA()
    {
        lock(m_Locker){ 
          // Do something with the dictionary
        }
    }

    public void OptionB()
    {
        lock(m_Hash){ 
          // Do something with the dictionary
        }
    }       
}

我开始涉足线程处理(主要是为多线程应用程序创建缓存,而不是使用HttpCache类,因为它没有连接到网站),我在很多示例中都看到了OptionA语法。可以在线查看,但我不了解通过OptionB完成的原因(如果有)。

最佳答案

选项B使用要保护的对象来创建关键部分。在某些情况下,这可以更清楚地传达意图。如果一致使用,则可以确保一次仅一个受保护对象的关键部分处于活动状态:

lock (m_Hash)
{
    // Across all threads, I can be in one and only one of these two blocks
    // Do something with the dictionary
}
lock (m_Hash)
{
    // Across all threads, I can be in one and only one of these two blocks
    // Do something with the dictionary
}

选项A的限制较少。它使用辅助对象为要保护的对象创建关键部分。如果使用了多个辅助对象,则可能一次有一个以上的受保护对象关键部分处于活动状态。

private object m_LockerA = new object();
private object m_LockerB = new object();

lock (m_LockerA)
{
    // It's possible this block is active in one thread
    // while the block below is active in another
    // Do something with the dictionary
}
lock (m_LockerB)
{
    // It's possible this block is active in one thread
    // while the block above is active in another
    // Do something with the dictionary
}

如果仅使用一个辅助对象,则选项A等同于选项B。就阅读代码而言,选项B的意图更加清晰。如果要保护多个对象,则选项B并不是真正的选择。

    公众号
    关注公众号订阅更多技术干货!