类实例在单个线程内调用和销毁时是否是线程安全的?

时间:2014-02-18 20:41:08

标签: .net vb.net multithreading thread-safety instance-variables

我认为我对线程安全的范围和实践非常困惑。 MSDN文档和许多评论员通常都说实例方法通常不是线程安全的。但是如果只在一个线程中创建和销毁一个类实例,我们还是担心线程安全吗?

请考虑以下事项。我们创建一个线程,并在该线程内部创建多个TestMethod实例,它修改实例的类变量。整个类实例线程是否安全,包括共享类变量?

Class InstancedClass
    Private testVar As Integer
    Private Shared sharedTestVar As Integer

    Public Sub TestMethod()
        'Do stuff to modify testVar/sharedTestVar
    End Sub
End Class

Public Class CallingClass
    Public Sub Main()
        Dim t As New Threading.Thread(Sub()
                                          Dim newInstance As New InstancedClass
                                          newInstance.TestMethod()
                                      End Sub)
        t.Start()

        Dim t2 As New Threading.Thread(Sub()
                                          Dim newInstance As New InstancedClass
                                          newInstance.TestMethod()
                                      End Sub)
        t2.Start()
    End Sub
End Class

问题摘要:

1。)如果类实例在线程中完全创建和销毁,那么它们是否是线程安全的?

2。)对此进行扩展,如果不接触线程范围之外的外部实例,属性和变量,那么所有代码​​线程都是安全的吗?

3。)如果一个类没有共享属性,它的共享方法线程是否安全?

3 个答案:

答案 0 :(得分:0)

1)是的,如果他们的范围没有达到更远,他们的方法不会改变实例边界之外的任何东西,他们的共享成员(如果有的话)本身就是线程安全的(参见答案3)。

2)是的,原因与1基本相同。

3)是的,如果他们做的事情不会改变任何其他对象。例如,共享Multiply方法通常是线程安全的。

答案 1 :(得分:0)

我对所有3个问题的回答都是NO:

1)不,它们不是自动线程安全的,例如当他们访问/修改共享数据时(例如,使用Shared sharedTestVar变量。

2)不,如果它访问共享属性,那么它不是线程安全的(没有任何锁定)。

3)否。仅当它不访问任何其他共享数据时(例如,具有共享属性或文件等的另一个类)。

答案 2 :(得分:0)

正如Crono1981对所有3个问题都说“是”。每个线程都有自己的堆栈,所有局部变量和方法参数都存储在该堆栈中。只要你不使用该堆栈之外的任何东西(例如:静态变量),它就是线程安全的。

关于线程的好文章: http://www.albahari.com/threading/