首页 > 其他 > 详细

lock语句

时间:2020-03-11 14:56:28      阅读:69      评论:0      收藏:0      [点我收藏+]

应用场景

lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
lock语句根本使用的就是Monitor.EnterMonitor.Exit,也就是说lock(this)时执行Monitor.Enter(this),大括号结束时执行Monitor.Exit(this)。
应用场景:经常会应用于防止多线程操作导致公用变量值出现不确定的异常,用于确保操作的安全性,比如抢购。
锁等于“行为可以预期”,不锁等于“行为不可预期”。

抢购举例

假设有商品库存为10,共有1000名顾客在几乎同一时间进行抢购。
不加lock的写法:

Parallel.For(0, customerCount, (i) =>
{
    TryToBuyGoods(customerCount);
});

加lock的写法:

Parallel.For(0, customerCount, (i) =>
{
    lock (inStockLock)
    {
        TryToBuyGoods(customerCount);
    }
});

加Monitor的写法:

Parallel.For(0, customerCount, (i) =>
{
    bool lockWasTaken = false;
    try
    {
        System.Threading.Monitor.Enter(inStockLock, ref lockWasTaken);
        TryToBuyGoods(customerCount);
    }
    finally
    {
        if (lockWasTaken)
            System.Threading.Monitor.Exit(inStockLock);
    }
});

结果如下:
技术分享图片
技术分享图片
技术分享图片
可以看出,这种情况不加lock是非常危险的事情。

示例代码

UseLockDemo

参考资料

lock 语句(C# 参考)

lock语句

原文:https://www.cnblogs.com/Lulus/p/12462234.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!