1

在 web 服务应用程序线程中使用静态/共享方法是否安全?将大量调用此方法以检索新实例。

例如:

 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 将返回另一种类型的新实例,因此它是线程安全的。

我担心的是,如果同时提出许多请求,我不会返回一个包含一个请求的名称和另一个请求的姓氏的人员实例。

4

3 回答 3

1

如果是线程安全的,它只会是GetAllAddresses线程安全的。否则,没关系。

关于您的UPDATE 1,是的,这将正常工作。它永远不会像您描述的那样感到困惑。它总是在创建对象的新实例,因此各个线程不会干扰彼此的数据。

于 2012-10-02T14:32:42.537 回答
1

鉴于 GetAllAddresses 只执行读取操作,那么静态方法是完全线程安全的,因为每个重新进入的线程都将创建自己的 Person 实例,对其的引用将存储在堆栈中。

因此,关于 UPDATE 1,因为每个线程都在使用一个新的 Person 实例,所以两个不同的线程不可能写入同一个 person 实例。

于 2012-10-02T14:38:57.523 回答
0

据我了解,您尝试制作一个new Person并将其返回到您的页面。

通过该代码,线程安全没有实际意义。您应该看到的是,当您将该人保存回数据库时,您必须使其线程安全以避免多次写入。

当您将其写回数据库时,有两种方法可以使其安全(创建新的或进行更新)

一种是使用互斥锁,第二种是使用标准的 asp.net 会话来锁定页面,这将使整个进程的线程安全。

于 2012-10-02T14:36:27.793 回答