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

相关推荐
谢斯5 小时前
[vscode] 使用unity打开vscode的取消.csproj的显示
ide·vscode·unity
魔术师Dix6 小时前
StartGame:Unity TDD 外部工程指南
学习·游戏·unity·c#·测试驱动开发
hsw8157739431 天前
第10章 软件架构的演化和维护 — 系统架构设计师
unity·系统架构·游戏引擎
tealcwu1 天前
【尝鲜】Unity 6.7alpha版本测试
unity·游戏引擎
懒狗跑ai的程序员Brain2 天前
如何利用粒子系统在unity制作一个烟花(粒子系统学习向)
学习·unity·游戏引擎
xcLeigh2 天前
Unity基础:材质与纹理入门——给物体穿上“衣服“
unity·游戏引擎·材质
unityのkiven2 天前
理解 GUILayout 与 EditorGUILayout,并探究 ScrollView 滚轮失效可能的原因
unity
ellis19702 天前
u3d插件xLua[二]例2:U3DScripting,例3:UIEvent分析
unity·lua