C#中的lock关键字有何作用
答案:1 悬赏:30 手机版
解决时间 2021-04-02 14:24
- 提问者网友:遮云壑
- 2021-04-01 20:16
C#中的lock关键字有何作用
最佳答案
- 五星知识达人网友:胯下狙击手
- 2021-04-01 20:36
Lock是C#自带的锁函数。
最常用的场景是服务端处理并发。
简单的例子: A B C 三个线程都想去取钱,而账户只有一个且不能透支,余额是100元。
如果三个一起取,每个都取60块钱。那么判断的时候,由于是并发的,A取了60,但是B同时也在取,B取的时候系统还没有把A的60给减掉,所以系统判断余额还是100,就给B也分了60块钱, 这样每个人都可以取到钱。最后账户余额将是-80元。 这就出错了。
用lock则可以去处理这个情况。
private bool deadlocked = true;
public void LockAccount(object o)
{
lock (this)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :(");
Thread.Sleep(500);
}
}
}
当三个线程都进来的时候,系统先把A放入队列, B C 访问的时候,就会告诉他们,已经锁住了,你们等着吧, 然后每500毫秒 B C去访问以下这个锁,看A是否把钱取完。当A完成的时候,deadlocked解开,放下一个线程进来,依次类推。
用LOCK就可以解决上面说的 3个线程并发取钱,最后导致程序出错的问题。 实际的应用可能会更复杂,但是原理也是如此。
最常用的场景是服务端处理并发。
简单的例子: A B C 三个线程都想去取钱,而账户只有一个且不能透支,余额是100元。
如果三个一起取,每个都取60块钱。那么判断的时候,由于是并发的,A取了60,但是B同时也在取,B取的时候系统还没有把A的60给减掉,所以系统判断余额还是100,就给B也分了60块钱, 这样每个人都可以取到钱。最后账户余额将是-80元。 这就出错了。
用lock则可以去处理这个情况。
private bool deadlocked = true;
public void LockAccount(object o)
{
lock (this)
{
while(deadlocked)
{
deadlocked = (bool)o;
Console.WriteLine("Foo: I am locked :(");
Thread.Sleep(500);
}
}
}
当三个线程都进来的时候,系统先把A放入队列, B C 访问的时候,就会告诉他们,已经锁住了,你们等着吧, 然后每500毫秒 B C去访问以下这个锁,看A是否把钱取完。当A完成的时候,deadlocked解开,放下一个线程进来,依次类推。
用LOCK就可以解决上面说的 3个线程并发取钱,最后导致程序出错的问题。 实际的应用可能会更复杂,但是原理也是如此。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯