如果总是返回新实例,静态方法是否是线程安全的?
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);
}
我有以下 类:
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);
}