最近做项目碰到了一个初始化时候出错的问题
请问C#中的new操作,分配空间和初始化,是一个完整的原子操作吗?C#中使用double check lock会出现线程不安全的问题吗?
以前只是听说过这种问题,以为不需要考虑的,想不到现在自己也遇到了...欢迎大家讨论,了解多线程初始化相关的东西也请提出来大家参考下,说不定哪天你也会遇到这样的问题哈
请问C#中的new操作,分配空间和初始化,是一个完整的原子操作吗?C#中使用double check lock会出现线程不安全的问题吗?
以前只是听说过这种问题,以为不需要考虑的,想不到现在自己也遇到了...欢迎大家讨论,了解多线程初始化相关的东西也请提出来大家参考下,说不定哪天你也会遇到这样的问题哈
{
lock()
{
if()
{
}
}
}
比如:
我初始化一个实例,a = new xx();然后马上接一句启动一个线程,这个线程需要访问初始化好的a,我发现其实这个线程访问的a,是没有完全初始化好的,导致了一些错误。我试过用线程延迟再访问的方法,貌似没问题了,但感觉影响性能,也不是规范的写法
还有,我初始化一个a = new xx();其他线程也要判断,要是a=null,进行初始化,否者跳出,这里偶尔也会出问题。这应该就是所谓的用DCL实现SIngleton。这类东西,以前听说过,一直不在意,现在发现还是得注意的
上网查了下,java里面DCL会引发线程安全的问题(具体原因谁来说一说?),但一直没人说C#里面是不是可以用DCL
既然没问题,我就用咯
C# 与公共语言运行库也提供了一种"静态初始化"方法,这种方法不需要显式地编写线程安全代码
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();
private Singleton() {}
public static Singleton Instance
{
get {
if (instance == null)
{ lock (syncRoot) {
if (instance == null) instance = new Singleton();
}
}
return instance;
}
}
}