使用SyncLock 语句
SyncLock 语句确保不会同时有多个线程执行该语句块。SyncLock 防止各个线程进入该语句块,直到没有其他线程执行它为止。
SyncLock 的最常见作用是保护数据不被多个线程同时更新。如果操作数据的语句必须在没有中断的情况下完成,请将它们放入 SyncLock 块。
有时将受独占锁保护的语句块称为“临界区”。
规则
-
分支。您不能从此块的外部分支到 SyncLock 块。
-
锁定对象值。lockobject 的值不能为 Nothing。必须先创建锁定对象,才能在 SyncLock 语句中使用此对象。
在执行 SyncLock 块时,不能更改 lockobject 的值。机制要求锁定对象保持不变。
行为
-
机制。线程到达 SyncLock 语句时,它将计算 lockobject 表达式,并挂起执行,直到获取了由表达式返回的对象上的独占锁。当另一线程到达 SyncLock 语句时,它将不能获取独占锁,直到第一个线程执行 End SyncLock 语句。
-
受保护的数据。如果 lockobject 为 Shared 变量,独占锁将防止类的任何实例中的线程在任何其他线程执行 SyncLock 块时执行该块。这会保护所有实例所共享的数据。
如果 lockobject 为实例变量(非 Shared),此锁将防止当前实例中正在运行的线程与相同实例中的另一线程同时执行 SyncLock 块。这会保护由单个实例维护的数据。
-
捕获和释放。SyncLock 块的操作就像 Try...Finally 结构,其中 Try 块获取 lockobject 上的独占锁,而 Finally 块则释放此锁。因此,SyncLock 块确保锁的释放,不管您如何退出块。即使发生未处理的异常,也是如此。
-
Framework 调用。SyncLock 块通过调用 System.Threading 命名空间中的 Monitor 类的 Enter 方法和 Exit 方法获取和释放独占锁。
示例
Class simpleMessageList
Public messagesList() As String = New String(50) {}
Public messagesLast As Integer = -1
Private messagesLock As New Object
Public Sub addAnotherMessage(ByVal newMessage As String)
SyncLock messagesLock
messagesLast += 1
messagesList(messagesLast) = newMessage
End SyncLock
End Sub
End Class