Sul*_*lNR 6 .net c# multithreading if-statement locking
此代码仅在if语句或两行代码中锁定吗?
lock (LockObject)
if (instance == null)
instance = Instance();
Run Code Online (Sandbox Code Playgroud)
lock锁定整个块.由于它后面没有花括号({}),它会锁定一个隐式块 - if语句.这里,相同的逻辑适用 - if如果满足条件则执行块.由于它也没有花括号,它隐含地有一个包含单个语句的块.换句话说,给定的代码相当于:
lock (LockObject) {
if (instance == null) {
instance = Instance();
}
}
Run Code Online (Sandbox Code Playgroud)
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)