从静态方法线程安全返回引用?

mxa*_*sim 8 c# multithreading

我有一节课:

class PrintStringDataBuilder
{
    PrintStringDataBuilder() { }
    public static GetInstance()
    {
        return new PrintStringDataBuilder();
    }

    //other class methods and fields, properties
}
Run Code Online (Sandbox Code Playgroud)

从客户代码访问:

PrintStringDataBuilder instance = PrintStringDataBuilder.GetInstance();
Run Code Online (Sandbox Code Playgroud)

以上是调用线程安全吗?

编辑:只是试图避免编写PrintStringDataBuilder builder = new PrintStringDataBuilder(); 在asp.net mvc web app中多次.PrintStringDataBuilder类中没有其他静态方法,静态字段或静态属性.

Tej*_*ejs 11

是?在不知道该类的构造函数的内部结构的情况下,您可以说调用GetInstance()是线程安全的.但是,该实例上的任何方法都不能保证是线程安全的,特别是因为您没有提供任何这些方法.

这简称为工厂模式.

编辑:如果你想要返回一个单身人士,你可以这样做:

.NET 4+

private static Lazy<PrintStringDataBuilder> _instance = new Lazy<PrintStringDataBuilder>(() =>
  {
      return new PrintStringDataBuilder();
  });

public static PrintStringDataBuilder GetInstance()
{
    return _instance.Value;
}
Run Code Online (Sandbox Code Playgroud)

.NET 3.5及更低版本

private static PrintStringDataBuilder _instance = null;
private static object _lockObject = new object();

public static PrintStringDataBuilder GetInstance()
{
    if(_instance == null)
    {
         lock(_lockObject)
         {
              if(_instance == null)
                 _instance = new PrintStringDataBuilder();
         }
    }

    return _instance;
}
Run Code Online (Sandbox Code Playgroud)


n8w*_*wrl 5

通过'threadsafe',您是否担心调用静态方法的多个线程将获得SAME PrintStringDataBuilder?答案是否定的,并且调用是线程安全的.

话虽如此,没有人可以从你给出的小片段中判断出其余的是否是它的构造函数.类实例不是线程安全的原因有很多.如果他们引用静态属性而没有锁定就是一个例子.