2011-08-08 82 views
1

在某些场景中,我对锁定的概念有点困惑。让我来解释一下,假设我有以下几点:C#多线程 - 锁定

private readonly MyClass myObj; 

private void Go(object state) 
{ 
    // call an instance member of myObj, but does it need to be locked? 
    myObj.SomeMethod(state); 
} 

所以现在的问题是不MyObj中需要调用的someMethod时被锁定?它是只读的,但是由于多个线程可以调用myObj的实例方法SomeMethod以及不同的状态,这不会引起问题?

谢谢。

回答

6

变量是只读的,但对象可以是可变的或不可变的 - 甚至并没有真正告诉你它是否可以安全地从多个线程中使用。

换句话说,它取决于MyClass的实现,并且您是否期望Go可以从涉及相同MyClass实例的多个线程中调用。 (现在我倾向于编写类而不是以确保线程安全,但通常每个线程都有自己的一组对象来玩 - 所以我可能有一个包含Go的类的实例,以及MyClass的一个实例,但知道其他线程不应该使用相同的实例。)

+0

不是用'SomeMethod'来锁定更多的关注,它是后续资源去'去'? – Smudge202

+0

@ Smudge202:这取决于 - 如果'MyClass'不声称是线程安全的,但包含'Go'的类确实,那么锁定应该在'Go'中。如果'MyClass.SomeMethod'是为了线程安全的(为了这个术语的适当含义......),那么'Go'不需要锁定。 –

+0

够公平的。尽管如此,我仍然发现所有可怕的倒退,代表'SomeMethod'的'Go'方法中的资源被锁定,这并不是线程安全的。个人喜好我猜。我也非常喜欢非线程安全的方式,并尽可能地确保线程的公寓/独立实例。简单得多。 – Smudge202

4

这取决于,如果SomeMethod是一个线程安全的方法,那么你不需要锁定。否则,您可能需要使用锁定。

+0

我不认为它是线程安全的! (这是一个正则表达式对象的匹配方法)。谢谢。 – Umair

+0

实际上,正则表达式对象上的匹配方法是线程安全的:http://msdn.microsoft.com/en-us/library/6h453d2h.aspx –

1

很难说某些没有关于“变化状态”的含义的更多信息,但总的来说,如果一个方法只是从字段中读取你知道不会在其他线程中改变,你应该没有锁的罚款。

但是,如果您只依赖于readonly,那么这还不够好,因为对象本身可能在来自不同线程的调用期间发生更改。

+0

我的观点是myObj.SomeMethod将从不同的线程中调用,因此myObj.SomeMethod的参数会有所不同。 – Umair