Dan*_*don 5 vb.net multithreading synclock
vb.Net多线程问题:
有什么区别
SyncLock syncRoot
''# Do Stuff
End SyncLock
Run Code Online (Sandbox Code Playgroud)
-和-
SyncLock Me
''# Do Stuff
End SyncLock
Run Code Online (Sandbox Code Playgroud)
SyncLock块内发生的所有代码都与同一对象上SyncLock块内发生的所有其他代码同步.显然,是不一样的(我假设,如果你是一个).MesyncRootMe.SyncRootMeICollection
SyncLock在一个对象上的块内发生的代码不会与SyncLock另一个对象上的块内的代码同步.
说你有这个代码:
' happening on thread 1 '
SyncLock myColl.SyncRoot
myColl.Add(myObject)
End SyncLock
' happening on thread 2 '
SyncLock myColl.SyncRoot
myColl.Remove(myObject)
End SyncLock
Run Code Online (Sandbox Code Playgroud)
以上情况很好:Add和Remove调用是同步的,这意味着它们不会同时发生(无论哪个首先调用都会执行,第二个调用直到第一个完成才会执行).
但是假设你有这个:
' happening on thread 1 '
SyncLock myColl.SyncRoot
myColl.Add(myObject)
End SyncLock
' happening on thread 2 '
SyncLock myColl ' NOTE: SyncLock on a different object '
myColl.Remove(myObject)
End SyncLock
Run Code Online (Sandbox Code Playgroud)
上述Add和Remove调用不以任何方式,形状或形式同步.因此,上述代码中没有线程安全性.
现在,为什么SyncRoot存在?很简单,因为在必要的最小规模上同步是有意义的; 即,不需要同步实际上不需要同步的代码.
考虑这个例子:
' happening on thread 1 '
SyncLock myColl
myColl.Add(myObject)
End SyncLock
' happening on thread 2 '
SyncLock myColl
' Why you would have code like this, I do not know; '
' this is just for illustration. '
myColl.Name = myColl.Name.Replace("Joe", "Bill")
End SyncLock
' happening on thread 3 '
SyncLock myColl
myColl.Name = myColl.Name.Replace("Bill", "Joe")
End SyncLock
Run Code Online (Sandbox Code Playgroud)
在上面,您正在进行超过必要的同步.该Add调用实际上与重命名myColl对象无关; 因此代码不需要同步.
这是该SyncRoot属性背后的思想:它为您提供了一个对象,其目的是提供一个公共对象,通过该对象可以同步对集合的修改/枚举.以某种其他方式涉及集合的代码- 但不需要与修改或读取集合内容的代码同步 - 应在适当的情况下同步到不同的对象上.