版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

先看以下代码:

    Sub sample12()
        For i As Integer = 0 To 5
            Dim sample12_Thread As New Thread(AddressOf sample12_doALoop1)
            sample12_Thread.Start(i)
        Thread.Sleep(1000)
        Console.ReadKey()
    End Sub
    Sub sample12_doALoop1(ByVal number As Integer)
        Dim counter As Integer = CType(number, Integer)
        For i As Integer = 1 To 100
            Console.Write(" " & counter)
    End Sub

得到的结果可能如下,关键的地方我用红框标记出来了:

可以看到上面的输出比较混乱,这是由于线程是由系统控制,我们也不知道在哪个位置,系统就将线程1停了启动了线程2,接着又将线程2停了,切换运行线程4……。本来想完整地输出100个0、100个1……(什么?你还想按照0至5的顺序输出?我这里只谈如何完整地输出100个0、100个1……不谈顺序),这段代码实现不了的,也许偶尔会正确。

解决上面的问题,就需要使用 SyncLock 语句。
MSDN:SyncLock 语句可确保多个线程不在同一时间执行语句块。 SyncLock 防止各个线程进入该语句块,直到没有其他线程执行它为止。SyncLock 的最常见作用是保护数据不被多个线程同时更新。 如果操作数据的语句必须在没有中断的情况下完成,请将它们放入 SyncLock 块。使用方法如下:

SyncLock lockobject
    [ block ]  ‘独占锁时要执行的语句块
End SyncLock

需要注意的是, lockobject应该满足以下条件:
1、值不能是Nothing
2、不应使用 Me 关键字为实例数据提供锁定对象
3、应该是引用类型,不要使用Integer这样的值类型
4、必须定义为线程间可以共享的变量,下面的例子将定义为模块级变量

根据以上介绍,修改后的代码如下:

定义一个模块级变量:

 Private lockObj As Object

修改后的主程序:

    Sub sample12()
        lockObj = New Object
        For i As Integer = 0 To 5
            Dim sample12_Thread As New Thread(AddressOf sample12_doALoop2)
            sample12_Thread.Start(i)
        Thread.Sleep(1000)
        Console.ReadKey()
    End Sub
    Sub sample12_doALoop2(ByVal number As Integer)
        Dim counter As Integer = CType(number, Integer)
        SyncLock lockObj
            For i As Integer = 1 To 100
                Console.Write(" " & counter)
        End SyncLock
    End Sub

我们将子线程的循环块代码锁定,确保它完成。运行结果如下:

还强调的是,虽然看着是按照0-5的顺序调用线程,但是输出顺序确实不能控制。除非是采用别的代码实现,留给各位朋友自己来写。

由于.net平台下C#和vb .NET 很相似,本文也可以为C#爱好者提供参考。

学习更多vb .net 知识,请参看 vb.net 教程 目录

VB . Net 教程 简介: VB . Net 是一种简单,现代,面向对象的计算机编程语言,由微软开发,将 . NET Framework和公共语言运行库的强大功能与作为Visual Basic标志的生产力优势相结合。 Visual Basic . NET VB . NET )是在 . NET Framework上 实现 的面向对象的计算机编程语言。 虽然它是经典的Visual Basic语言的演变,但是它不 . . .
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 如上一节《 vb . net 教程 6 - 16 使用 SyncLock 语句 实现 线程 同步 》介绍的 SyncLock 语句 ,是一种简单处理 同步 的方法。 . net 还提供了Monitor类处理 线程 同步 。Monitor类比较重要的几个静态方法: Enter 在指定对象上获取排他锁。 Exit 释放指定对象上的 . . .
lock就是把一段代码定义为临界区,所谓临界区就是同一时刻只能有一个 线程 来操作临界区的代码,当一个 线程 位于代码的临界区时,另一个 线程 不能进入临界区,如果试图进入临界区,则只能一直等待(即被阻止),直到已经进入临界区的 线程 访问完毕,并释放锁旗标。 其基本 使用 方式如下: C - sharp代码 classTest //定义一个私有成员变量,用于Loc . . .