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

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使用要保护的对象来创建关键部分。在某些情况下,这可以更清楚地传达意图。如果持续使用,则可以确保一次仅一个 protected 对象的关键部分处于 Activity 状态:

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的限制较少。它使用辅助对象为要保护的对象创建关键部分。如果使用了多个次要对象,则可能一次有多个关键部分用于 protected 对象处于 Activity 状态。
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并不是真正的选择。

08-26 15:42