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

相关推荐
新手unity自用笔记4 小时前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
心前阳光6 小时前
Unity之XR Interaction Toolkit | IPointerDownHandler问题
unity·游戏引擎·xr
帅_shuai_1 天前
unity 静态字段内存查找工具
unity·游戏引擎
鹿野素材屋2 天前
Unity超轻量级中文语音播报,仅5兆大小,无需联网即可使用,适用于弹幕、提示等动态语音播出
unity·游戏引擎
玖玥拾3 天前
Unity3D RPG 入门项目(八)游戏设置面板、帧率控制、快捷技能药品栏、技能解锁系统
游戏·3d·unity·游戏引擎
ellis19703 天前
u3d插件xLua[十] lua侧判空问题
unity
牛哇网络工作室4 天前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
ellis19704 天前
u3d插件xLua[九]例8 Hotfix
unity
淡海水4 天前
01-07-运行时-GC深度剖析-内存分配回收与结构选择
jvm·windows·unity·gc
优梦创客4 天前
游戏开发架构选型:第1篇|什么是架构?从进球事件看 MVC 的局限
unity·架构·游戏引擎·游戏开发