【问题标题】:Static method is thread-safe if new instances are returned allways it gets called?如果总是返回新实例,静态方法是线程安全的吗?
【发布时间】:2018-02-09 03:51:51
【问题描述】:

我有以下课程:

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 是静态的,但会返回新实例(不是单例) 你怎么看? 我的单元测试显示是 thread.safe,但我完全不确定。

非常感谢

【问题讨论】:

  • " SessionPasoProxy 位于 ASP.NET WebForms aspx 页面内" 为什么要将此类添加到页面类中,两者并不相关。将SessionPasoProxy 类添加到它自己的文件中。除此之外,是的,它是线程安全的
  • 嗨,我编辑了。我想说“在里面使用”。为什么是线程安全的?
  • 该方法是线程安全的,每次调用 Obtener 方法时,都会创建一个新的 SesionPaso 对象,并且不会将信息存储在静态变量中。

标签: asp.net multithreading thread-safety threadpool application-pool


【解决方案1】:

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

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

但有一件事:你也应该将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);
}     

【讨论】:

  • 你是对的。这是遗留代码,所以我不想碰它。只有我在寻找一点代码不是线程安全的。非常感谢
  • 您知道一些用于检查 ASP.NET WebForms 应用程序中的线程安全违规的工具吗?
  • 你可以试试Microsoft's CHESS
  • 我下载了,但是我觉得不太好用?我是对的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 2010-11-08
  • 2010-10-01
相关资源
最近更新 更多