vb,net 多个线程读取同一个静态集合为什么不发生任何冲突和死销?

oto365 2014-12-16 08:36:51

Shared List3 As New List(Of Integer)(System.Linq.Enumerable.Range(1, 1001))
Shared List4 As New List(Of Integer)
Shared List5 As New List(Of Integer)


Shared Sub MySub1()

For index As Integer = 0 To 1000

List4.Add(List3.MyFunc(index))
Next
End Sub

Shared Sub MySub2()

For index = 0 To 1000
List5.Add(List3.MyFunc(index))
Next

End Sub


多个线程同时读取同一个List3集合时为什么不发生争抢和死销及冲突呢。

只要写入操作时才发生呢。
...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oto365 2014-12-25
  • 打赏
  • 举报
回复
感谢一些助言。
於黾 2014-12-17
  • 打赏
  • 举报
回复
即使是线程安全的集合,在进行遍历的时候也需要加锁控制 否则一个线程正在执行循环,另一个线程删除了其中一项,会造成索引超出界限
winnowc 2014-12-17
  • 打赏
  • 举报
回复
多线程并发写一块内存不是会出现内存错误,而是由于执行顺序不可控导致的结果不确定。比如n个线程并发对一个int变量做自增操作,并不会有任何异常,只是因为没有同步,导致最终结果可能不是n个顺序操作的累加。把这种现象叫做“内存错误”不太合适。 单纯对内存的读写比较简单,但是往往我们不是直接读写内存,而是使用一些类间接的读写,这时候就会涉及类的内部状态,情况更复杂点。 能够说是错误的是对不是线程安全的方法进行并发调用,导致所在类的内部状态混乱,就可能出现异常或错误。理论上只要文档没有明确说明一个属性/方法是线程安全的,都不应该并发调用,无论是读还是写。有些类在读或者使用者认为是读的场景也会更新内部状态,这种并发读也可能导致异常或者错误。 所以是否能够并发读不能自己想当然,必须看文档。像List<T>是文档说明了"It is safe to perform multiple read operations on a List<T>, but issues can occur if the collection is modified while it’s being read.",所以仅仅对它并发读没有问题。
ajaxfeifei 2014-12-16
  • 打赏
  • 举报
回复
两个人能同时在同一张纸的同一个位置写字吗? 如果同时有多个线程同时在同一个位置写入数据,那直接就混乱了。
Tiger_Zhao 2014-12-16
  • 打赏
  • 举报
回复
读不改变状态,线程在任何地方打断、再恢复,没有任何问题,无需控制,所以没有冲突。
写会改变状态,比如线程在遍历节点时,正好遍历完第3个将要遍历第4个的时候中断了,恢复过来后:可能第2个位置插入了一个节点,原第3变成了第4,那么继续遍历等于将原第3重新遍历了一次;也可能第2个位置删除了一个节点,原第4变成了第3,那么继续遍历等于将原第4漏过了遍历……
各种情况太复杂,所以只要有了变动,就认为有冲突出错。
oto365 2014-12-16
  • 打赏
  • 举报
回复
网上的文章说法如下; 说明了读操作中争抢的现象。到底哪个是对呢? ============================================= 如果只是保证线程安全,只需要对写操作进行加锁就行了,多线程并行写一块内存是会出现内存错误的。 多个线程并行的读一块内存数据本身是不会出错的,但是会出现上下文不一致的设计上的问题。比如一个线程读取了数据在还没来得及显示出来时,原数据被另外一个线程改变了,等你显示出来的时候,显示的结果和原数据已经不一样了。为了保证上下文一致就读加锁。好像买火车票一样,一个人在买一张票,读取剩余票数还剩1张,结果在点击去确定的时候被已经被另外一个人(另一个线程)买走了。其实没有余票了,给了假象,读加锁就是防止这个出现的。 ==================================================

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧