我今天在我们的代码库中遇到了一些单例代码,我不确定以下是否是线程安全的:
public static IContentStructure Sentence{
get {
return _sentence ?? (_sentence = new Sentence());
}
}
该语句等价于:
if (_sentence != null) {
return _sentence;
}
else {
return (_sentence = new Sentence());
}
我相信 ??只是一个编译器技巧,生成的代码仍然不是原子的。换句话说,两个或多个线程可以在将 _sentence 设置为新的 Sentence 并返回之前发现 _sentence 为空。
为了保证原子性,我们必须锁定那段代码:
public static IContentStructure Sentence{
get {
lock (_sentence) { return _sentence ?? (_sentence = new Sentence()); }
}
}
这一切都正确吗?