gpt4 book ai didi

vb.net - `Synclock syncroot` 和 `SyncLock Me` 和有什么区别?

转载 作者:行者123 更新时间:2023-12-02 16:03:38 24 4
gpt4 key购买 nike

vb.Net多线程问题:

有什么区别

SyncLock syncRoot  
''# Do Stuff
End SyncLock

-和-

SyncLock Me  
''# Do Stuff
End SyncLock

最佳答案

SyncLock block 中发生的所有代码都与同一对象上SyncLock block 中发生的所有其他代码同步。显然,MesyncRoot 不同(我假设是 Me.SyncRoot,如果您的 Me 是一个 ICollection)。

一个对象上的 SyncLock block 内发生的代码不会与另一对象上的 SyncLock block 内的代码同步。

假设您有以下代码:

' happening on thread 1 '
SyncLock myColl.SyncRoot
myColl.Add(myObject)
End SyncLock

' happening on thread 2 '
SyncLock myColl.SyncRoot
myColl.Remove(myObject)
End SyncLock

上面的内容很好:AddRemove 调用是同步的,这意味着它们不会同时发生(首先调用的将执行,第二个将不会执行)直到第一个完成)。

但假设你有这个:

' 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

上述AddRemove调用在任何方式、形状或形式上都同步。因此上面的代码不存在线程安全问题。

现在,为什么存在 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

在上面,您正在同步超过必要的内容Add 调用实际上与 myColl 对象的重命名无关;因此代码不需要同步。

这是 SyncRoot 属性背后的想法:它为您提供一个对象,其全部目的是提供一个公共(public)对象,通过该对象可以同步对集合的修改/枚举。以某种其他方式涉及集合的代码——但不需要与修改或读取集合内容的代码同步——应该同步,在适当的情况下,在不同的对象上。

关于vb.net - `Synclock syncroot` 和 `SyncLock Me` 和有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2858540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com