我认为我对线程安全的范围和实践非常困惑。 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。)如果一个类没有共享属性,它的共享方法线程是否安全?
答案 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/