C#锁定单行(if语句)

Sul*_*lNR 6 .net c# multithreading if-statement locking

此代码仅在if语句或两行代码中锁定吗?

lock (LockObject)
    if (instance == null)
        instance = Instance();
Run Code Online (Sandbox Code Playgroud)

Mur*_*nik 6

lock锁定整个块.由于它后面没有花括号({}),它会锁定一个隐式块 - if语句.这里,相同的逻辑适用 - if如果满足条件则执行块.由于它也没有花括号,它隐含地有一个包含单个语句的块.换句话说,给定的代码相当于:

lock (LockObject) {
    if (instance == null) {
        instance = Instance();
    }
}
Run Code Online (Sandbox Code Playgroud)


VMA*_*Atm 5

if语句不能单独执行,它后面需要块来表示true-case 表达式,因此,正如@Mureinik 已经说过的那样,lock锁定整个初始化块。你甚至可以这样写:

lock (LockObject) if (instance == null) instance = Instance();
Run Code Online (Sandbox Code Playgroud)

但是,不建议在这种情况下编写不带花括号的代码,因为这样会非常混乱且难以调试。另请注意,该lock语句是类使用的语法糖Monitor,并且您的代码被编译为:

try
{
    Monitor.Enter(LockObject);
    if (instance == null)
    {
        instance = Instance();
    }
}
finally
{
    Monitor.Exit(LockObject);
}
Run Code Online (Sandbox Code Playgroud)

我想指出的是,对于初始化逻辑,您可以使用一个Lazy<T>类,它是线程安全的,并且使用不像 那样繁重的结构Monitor,并且可以比您的代码执行得更快。代码将是这样的:

// field in class
Lazy<Instance> lazyInstance = new Lazy<Instance>(() => Instance());

//usage in code
var instanceValue = lazyInstance.Value;
Run Code Online (Sandbox Code Playgroud)