VB   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了vb.net – `Synclock syncroot`和`SyncLock Me`有什么区别?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
vb.Net多线程问题:

有什么区别

SyncLock syncRoot  
  ''# Do stuff  
End SyncLock

-和-

SyncLock Me  
  ''# Do stuff  
End SyncLock
SyncLock块中发生的所有代码都与同一对象上SyncLock块内发生的所有其他代码同步.显然,Me与syncRoot不同(我假设,Me.SyncRoot,如果你的Me是ICollection).

在一个对象上的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

以上情况很好:添加和删除调用是同步的,这意味着它们不会同时发生(无论哪个首先调用都会执行,第二个调用直到第一个完成才会执行).

但是假设你有这个:

' 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

上述添加和删除调用不会以任何方式,形状或形式同步.因此,上述代码中没有线程安全性.

现在,为什么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属性背后的思想:它为您提供了一个对象,其目的是提供一个公共对象,通过该对象可以同步对集合的修改/枚举.以某种其他方式涉及集合的代码 – 但不需要与修改或读取集合内容的代码同步 – 应在适当的情况下同步到不同的对象上.

大佬总结

以上是大佬教程为你收集整理的vb.net – `Synclock syncroot`和`SyncLock Me`有什么区别?全部内容,希望文章能够帮你解决vb.net – `Synclock syncroot`和`SyncLock Me`有什么区别?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。