在类中拥有多个锁定对象的最佳实践

时间:2016-05-27 10:08:36

标签: c# multithreading

在下面的课程中,我必须做两种完全不同的方法,这些方法与彼此无关。但是我在它们中只使用了一个锁定对象。

我的问题是,这种情况下的最佳做法是什么?每个都有两个单独的锁定对象或共享一个(正如我们在这里做的那样)?

class MyClass
{

private static object _lock = new object();

public void DoSomething()
{
    lock (_lock)
    {

    }
}

public void DoSomethingTotallyDifferent()
{
    lock (_lock)
    {

    }
}
}

2 个答案:

答案 0 :(得分:5)

锁定对象应该专用于关键资源,而不是类。

例如,如果您的类在A方法中使用关键资源DoSomething,则应该有一个_lockA对象。如果DoSomethingTotallyDifferent也访问此资源,则它应使用相同的锁对象。如果它访问其他关键资源B,那么它当然应该锁定相应的锁对象_lockB。如果必须使用相同的资源,这些方法只会介入...

答案 1 :(得分:4)

问题是:可以相互调用DoSomethingDoSomethingTotallyDifferent吗?如果是这样,您可以创建死锁。也许它现在不会互相打电话,但将来可能也会这样。

我的两分钱:比抱歉更安全。使用两个单独的锁定变量。