You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程访问整数如何选同步方式?volatile、Interlocked还是lock?

多线程同步方式选择:volatile、Interlocked还是lock?

1. 1-Write/1-Read:直接忽略还是加volatile?

别省那点事,加volatile。
虽然int这类原生类型的赋值本身是原子操作(不会出现半写半读的数据撕裂),但编译器和CPU的缓存优化会搞事情——写线程改了值,读线程可能还在读取缓存里的旧数据,永远看不到最新结果。volatile就是专门解决这个问题的:禁止编译器优化该变量的读写逻辑,强制CPU每次都从主内存读写,保证数据可见性。它的性能成本极低,完全没必要冒潜在的bug风险。

2. 1-Write/N-Read:直接忽略还是加volatile?

必须加volatile。
核心问题依然是可见性。多个读线程中,只要有一个线程没读到最新值,业务逻辑就可能出现异常。volatile能让写操作的结果立刻同步到主内存,确保所有读线程都能拿到最新的变量值。别抱着“读线程多总有一个能读到”的侥幸心理,线上bug往往就源于这种偷懒。

3. N-Write/1-Read:Interlocked是不是最佳方式?

绝对是最佳选择。
多线程写同一个变量时,普通赋值(比如i = 10)或者复合操作(比如i++)都不是原子的——两个线程同时写,会出现值被覆盖的情况。Interlocked系列方法(比如Interlocked.Exchange、Interlocked.Increment)是硬件级别的原子操作,不需要内核态切换,比lock轻量太多。
比如要给i赋值,用Interlocked.Exchange(ref i, 10);要做i++,用Interlocked.Increment(ref i),既保证原子性,又保证可见性,完美适配这个场景。

4. 你大概率打错了?应该是N-Write/N-Read?

如果是多写多读的场景,依然优先用Interlocked——只要你的操作是单个变量的原子操作(增减、交换等)。如果需要同时操作多个变量,或者有复杂的代码逻辑要同步,那才需要上lock。lock是通用的重量级同步方案,能解决所有同步问题,但性能开销大,能不用就不用。


一句话总结各工具的适用场景:

  • volatile:管可见性,单写多/单读、写操作本身是原子性的场景用它。
  • Interlocked:管原子性+可见性,多线程对单个变量的简单原子操作(增减、交换)用它,性能最优。
  • lock:管复杂同步,多个变量操作、代码块同步,或者没法用Interlocked的场景才用,别上来就锁。

内容的提问来源于stack exchange,提问作者WardenAllen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:40:44