如果我想确保只创建一次实例,我是否需要在此处添加锁定块?
if (instance==null)
{
instance = new Class();
}
由于IF中只有1条指令,我不是100%肯定。在下面的情况下,我确定我需要它,但我想仔细检查是否同样适用于上面的代码。
if (instance==null)
{
int i = 5;
int y = 78;
instance = new Class(i, y);
}
修改
是的,我假设多线程
答案 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)