我正在使用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并不是真正的选择。