Unity中的Lock,到底在锁什么,什么时候该用?

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不会让代码更快,只会让其他线程更久,主线程照样会卡

相关推荐
淡海水3 小时前
07-03-源码-.NET Core GC标记与扫描
unity·c#·.netcore·gc
上班摸鱼下班游戏12 小时前
从零开始玩转 DOTween
unity·游戏引擎
阿松爱学习17 小时前
【Unity开发】Unity长截图功能实现
unity·c#·游戏引擎
小小数媒成员18 小时前
Rect Transform
游戏·unity·游戏引擎
淡海水1 天前
07-01-源码-.NET Core GC总览与架构
unity·架构·c#·.netcore·gc
淡海水2 天前
06-03-源码-时间分片与调度策略
unity·c#·gc
五仁烧饼3 天前
动手学 Shader Graph(二):溶解与边缘发光
游戏·unity·shader·shader graph
淡海水3 天前
06-02-源码-增量标记算法实现
算法·unity·c#·gc
淡海水3 天前
06-01-源码-Incremental GC总览与设计
unity·c#·gc
郝学胜-神的一滴3 天前
游戏设计:原型与开发 07:像游戏设计师一样工作
图像处理·游戏·unity·图形渲染·游戏策划·游戏设计