我需要锁吗?

时间:2011-09-13 20:15:56

标签: c# .net

如果我想确保只创建一次实例,我是否需要在此处添加锁定块?

        if (instance==null)
        {
            instance = new Class();
        }

由于IF中只有1条指令,我不是100%肯定。在下面的情况下,我确定我需要它,但我想仔细检查是否同样适用于上面的代码。

        if (instance==null)
        {
            int i = 5;
            int y = 78;
            instance = new Class(i, y);
        }

修改

是的,我假设多线程

5 个答案:

答案 0 :(得分:9)

答案 1 :(得分:8)

如果这是多线程的,那么是的,你需要一个锁或某种形式的同步。

但是,如果这是为了允许延迟实例化,我建议使用Lazy<T>。它可以为您处理线程安全,并且无需检查。

答案 2 :(得分:7)

是的,你需要锁定两个例子。让我们对这些行进行编号以便于解释:

1 if (instance == null)
2 {
3     instance = new Class();
4 }

现在,假设您有两个线程,A和B.两个线程都在执行此代码。首先,A在第1行测试instance,因为它为空,所以它采用真正的路径 - 在第3行。然后,在执行第3行之前获得上下文切换,而B执行相同的操作(第1行为true)并最终在第3行)。现在,这两个主题都位于if语句正文中,您将获得instance的两个分配。

答案 3 :(得分:2)

如果您使用多个线程,是的。多个线程可以在任何实际将实例设置为新类之前输入if语句。

答案 4 :(得分:1)

你需要阅读这篇文章:

Implementing the Singleton Pattern in C#

以及这个问题:

Is this Singleton implementation correct and thread-safe?

祝你好运:)