vb.net – `Synclock syncroot`和`SyncLock Me`有什么区别?
发布时间:2020-12-17 00:06:17 所属栏目:大数据 来源:网络整理
导读:vb.Net多线程问题: 有什么区别 SyncLock syncRoot ''# Do Stuff End SyncLock -和- SyncLock Me ''# Do Stuff End SyncLock SyncLock块中发生的所有代码都与同一对象上SyncLock块内发生的所有其他代码同步.显然,Me与syncRoot不同(我假设,Me.SyncRoot,如果你
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属性背后的思想:它为您提供了一个对象,其目的是提供一个公共对象,通过该对象可以同步对集合的修改/枚举.以某种其他方式涉及集合的代码 – 但不需要与修改或读取集合内容的代码同步 – 应在适当的情况下同步到不同的对象上. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |