防止数据被多个线程同时更新

使用SyncLock 语句

SyncLock 语句确保不会同时有多个线程执行该语句块。SyncLock 防止各个线程进入该语句块,直到没有其他线程执行它为止。

SyncLock 的最常见作用是保护数据不被多个线程同时更新。如果操作数据的语句必须在没有中断的情况下完成,请将它们放入 SyncLock 块。

有时将受独占锁保护的语句块称为“临界区”。

规则

  • 分支。您不能从此块的外部分支到 SyncLock 块。

  • 锁定对象值。lockobject 的值不能为 Nothing。必须先创建锁定对象,才能在 SyncLock 语句中使用此对象。

    在执行 SyncLock 块时,不能更改 lockobject 的值。机制要求锁定对象保持不变。

行为

  • 机制。线程到达 SyncLock 语句时,它将计算 lockobject 表达式,并挂起执行,直到获取了由表达式返回的对象上的独占锁。当另一线程到达 SyncLock 语句时,它将不能获取独占锁,直到第一个线程执行 End SyncLock 语句。

  • 受保护的数据。如果 lockobjectShared 变量,独占锁将防止类的任何实例中的线程在任何其他线程执行 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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值