如果总是返回新实例,静态方法是否是线程安全的?

Static method is thread-safe if new instances are returned allways it gets called?

我有以下 类:

public class SesionPasoProxy
{
    private static EntitySerializer _serializer = EntitySerializer.Create();

    public static string Obtener(Guid idSesion, int orden)
    {
        SesionPaso item = new SesionPaso();
        item.Orden = orden;
        item.IdSesion = idSesion;
        return _serializer.ToXml(item);

    }        
}


 public class EntitySerializer
 {
      private EntitySerializer(){}  
      public static EntitySerializer Create()
      {
         return EntitySerializer.Create("Test");
      }

       public static EntitySerializer Create(string serializationContextName)
       {
            EntitySerializer  instance = new EntitySerializer();
            instance.Name = serializationContextName;
            return instance;
       }
       public ToXml(SesionPaso x){ return x.toString();}
}

该代码是线程安全的吗? SessionPasoProxy 在 ASP.NET WebForms aspx 页面中使用。所以它可以同时被调用。 如您所见,EntitySerializer 是静态的,但是 returns 个新实例(不是单例) 你怎么看? 我的单元测试显示 thread.safe,但我一点也不确定。

非常感谢

一般来说,静态方法并不比实例方法更安全或更不安全。 但是如果他们只使用局部变量而不是字段,那么他们很可能是线程安全的(当然这取决于使用的方法)。

在你的情况下 Create 是线程安全的,因为它总是 returns 一个新实例并且没有使用其他(静态)字段可以同时从不同线程访问。

但有一件事:您也应该将 EntitySerializer.ToXml 设置为静态,而不是在 Obtener 中使用相同的实例。它不需要是一个实例方法:

public static string ToXml(SesionPaso x){ return x.toString();}

那么你不需要 static 字段 _serializer(至少不需要这个):

public static string Obtener(Guid idSesion, int orden)
{
    SesionPaso item = new SesionPaso();
    item.Orden = orden;
    item.IdSesion = idSesion;
    return EntitySerializer.ToXml(item);
}