在下面的课程中,我必须做两种完全不同的方法,这些方法与彼此无关。但是我在它们中只使用了一个锁定对象。
我的问题是,这种情况下的最佳做法是什么?每个都有两个单独的锁定对象或共享一个(正如我们在这里做的那样)?
class MyClass
{
private static object _lock = new object();
public void DoSomething()
{
lock (_lock)
{
}
}
public void DoSomethingTotallyDifferent()
{
lock (_lock)
{
}
}
}
答案 0 :(得分:5)
锁定对象应该专用于关键资源,而不是类。
例如,如果您的类在A
方法中使用关键资源DoSomething
,则应该有一个_lockA
对象。如果DoSomethingTotallyDifferent
也访问此资源,则它应使用相同的锁对象。如果它访问其他关键资源B
,那么它当然应该锁定相应的锁对象_lockB
。如果必须使用相同的资源,这些方法只会介入...
答案 1 :(得分:4)
问题是:可以相互调用DoSomething
或DoSomethingTotallyDifferent
吗?如果是这样,您可以创建死锁。也许它现在不会互相打电话,但将来可能也会这样。
我的两分钱:比抱歉更安全。使用两个单独的锁定变量。