C#多线程 - 锁定

时间:2011-08-08 12:05:18

标签: c# multithreading locking

我对某些情况下的锁定概念感到有点困惑。让我解释一下,假设我有以下内容:

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);
}

所以问题是调用SomeMethod时是否需要锁定myObj?它是只读的,但是由于多个线程可以调用具有不同状态的myObj的实例方法SomeMethod,这不会导致问题吗?

感谢。

3 个答案:

答案 0 :(得分:6)

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

换句话说,它取决于MyClass的实现,以及您是否希望从引用同一Go实例的多个线程调用MyClass。 (这些天我倾向于将类而不是编写为线程安全的,但通常每个线程都有自己的一组对象可供使用 - 所以我可能有一个包含{{1的类的实例和Go的实例,但知道其他线程不应该使用相同的实例。)

答案 1 :(得分:4)

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

答案 2 :(得分:1)

如果没有关于“变化状态”的含义的更多信息,很难肯定地说,但一般来说,如果一个方法只读取你知道在其他线程上不会改变的字段,你应该没问题没有锁。

如果你只依赖readonly,那么这还不够好,因为在不同线程的调用过程中对象本身可能会发生变化。