何时使用锁定指南

我想知道开发人员应该遵循何时(以及何处)放置锁的指导方针。

例如:我理解应锁定此类代码,以避免另一个线程意外更改SomeHeapValue值的可能性。

class Foo { public SomeHeapObject myObject; public void DoSummat(object inputValue_) { myObject.SomeHeapValue = inputValue_; } } 

然而,我的问题是,锁定有多深? 例如,如果我们有这个代码:

 class Foo { public SomeHeapObject myObject; public void DoSummat(object inputValue_) { myObject.SomeHeapValue = GetSomeHeapValue(); } } 

我们应该锁定DoSummat(…)方法,还是应该锁定GetSomeHeapValue()方法?

在编写multithreading代码时,是否有任何指导方针都要记住?

我找到的锁定和线程的最佳指南是这个页面(这是我在处理锁定和线程时参考的文本):

http://www.albahari.com/threading/

哟想要“锁定和线程安全”这一段,但也读了其余部分,它写得非常好。

  • 锁定尽可能少,但尽可能多。

  • 尽可能避免锁定 – 在.NET 4.0中,有一些替代方法不会导致上下文切换。

  • 尽量不要多次锁定。 相应地构建您的API。 例如一个队列。 DeQueue – 制作一个替代的DeQueue(int amount),它可以使用一个锁来使许多项目出列。