1.一句话理解lock
lock的作用只有一个:防止多个线程"同时"访问和修改同一份数据。
2.为什么需要Lock
经典例子
cs
int balance = 100;
void Withdraw()
{
balance -= 50;
}
如果两个线程同时执行
线程A:读 balance = 100
线程B:读 balance = 100
线程A:写 balance = 50
线程B:写 balance = 50
结果是:钱只少了50,但取了两次。
3.lock是怎么解决这个问题的?
cs
object _locker = new object();
lock (_locker)
{
balance -= 50;
}
同一时间内,只允许一个线程进入这段代码
执行顺序会变成:
cs
线程A:进 lock → 扣钱 → 出 lock
线程B:等 A 完成 → 再进 → 再扣
4.lock锁的是对象,不是代码
cs
lock (someObject)
{
// 临界区
}
someObject是锁,只要锁是同一个对象,线程就会互斥,换对象和换锁没有任何保护结果
cs
lock (new object()) // 每次都是新锁
{
...
}
等于没锁
5.误区
lock不会让代码更快,只会让其他线程更久,主线程照样会卡