我想知道开发人员在何时(以及在何处)放置锁时应遵循哪些准则。
例如:我知道应该锁定诸如此类的代码,以避免另一个线程意外更改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()方法?
构造多线程代码时,你是否要牢记所有准则?
我找到的关于锁定和线程的最佳指南是此页面(这是我在使用锁定和线程时参考的文本):
http://www.albahari.com/threading/
你需要“锁定和线程安全”这一段,但也请阅读其余内容,它的文字写得非常好。
谢谢,这很有用...但是为什么所有示例都使用静态成员变量?类成员变量中也存在线程安全问题,对吗?
@miguel:可以使用“ lock(this)”锁定实例成员,此页上的说明和示例2提供了更多详细信息:msdn.microsoft.com/zh-cn/library/c5kehkcz%28VS.71%29.aspx。我认为他在Albahari网站上使用的是静态方法,因为这样他就不必创建类的实例,从而简化了示例。
@miguel:您的锁对象需要在各个线程之间共享才能使用,而static是一种干净而简便的方法。静态天生不是邪恶的,只是像旧世界的地球一样被滥用。
专注于静态的另一个原因是,有一种简单的方法可以使任何实例成员摆脱线程问题的困扰-根本不要将其暴露给多个线程。这也是为什么大多数BCL类对实例成员而言不是线程安全的原因,除了一些专门用于线程相关任务的类之外-如果可能永远不会以这种方式使用某些东西,为什么要让每个人都付出创建线程安全的代价?大多数BCL类在静态成员中都是线程安全的。
@ user218447该片段的确切位置是“锁定和线程安全”吗?我在那个网站上找不到