在webservice应用程序线程中使用静态/共享方法是否安全?将大量调用此方法来检索新实例。
例如:
Public Shared GetPerson(ByVal name as String,ByVal surname) as Person
Dim p As New Person
p.Name = name
p.Surname = surname
p.Addresses = GetAllAddresses(name)
return p
End Function
更新1
发布的代码只是一个快速打印的样本,用于解决问题。 GetAllAdrresses将返回另一个类型的新实例,因此它将是线程安全的。
我担心的是,如果同时发出许多请求,我就不会返回一个名为一个请求和另一个请求的人的实例。
答案 0 :(得分:1)
如果GetAllAddresses
是线程安全的,那么它只是线程安全的。否则,没关系。
关于 UPDATE 1 ,是的,这样可以正常使用。它永远不会像你描述的那样混淆。它总是创建对象的新实例,因此各种线程不会干扰彼此的数据。
答案 1 :(得分:1)
鉴于GetAllAddresses仅执行读取操作,则静态方法完全是线程安全的,因为每个重新进入的线程将创建自己的Person实例,其引用将存储在堆栈中。
因此,关于UPDATE 1,因为每个线程都在使用新的Person实例,所以两个不同的线程无法写入同一个人实例。
答案 2 :(得分:0)
根据我的理解,您尝试制作new Person
并将其返回到您的页面。
通过该代码,线程安全没有实际意义。您应该看看,当您要将该人员保存回数据库时,您必须使其安全,以避免多次写入。
当您将数据写回数据库(创建新数据或进行更新)时,有两种方法可以使其安全。
一个是使用互斥锁,第二个是使用锁定页面的标准asp.net会话,它将使整个过程的线程安全。