何时使用锁定指南
我想知道开发人员应该遵循何时(以及何处)放置锁的指导方针。
例如:我理解应锁定此类代码,以避免另一个线程意外更改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),它可以使用一个锁来使许多项目出列。