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

能否在KMM commonMain代码中使用@Synchronized?对JS端有何影响?

Kotlin Multiplatform中@Synchronized注解的常见问题解答

1. 仅面向JVM和JS平台的KMM库,是否可在commonMain通用代码中使用@Synchronized注解?

可以在commonMain中使用该注解,但要明确:这个注解仅在JVM平台生效,JS平台会直接忽略它的同步语义。Kotlin多平台允许在通用代码中引入JVM专属注解,不会导致编译错误。

2. 若在commonMain中使用该注解,对调用此库代码的Kotlin/JS应用会产生什么影响?

对JS应用的直接影响很小——注解不会被编译到最终的JS产物中,也不会触发任何线程同步逻辑。但要注意:如果你的common代码依赖@Synchronized来保证并发安全,JS端会完全失去这层保护。因为JS虽为单线程模型,但涉及异步操作(比如Promise、Worker)时,仍可能出现数据竞争问题,需要手动实现JS环境下的同步方案(比如用原子变量、锁工具类)。

3. 在commonMain中使用@Synchronized时,IntelliJ显示其导入自kotlin-stdlib-common;在jsMain中显示导入自kotlin-stdlib-js,但两种场景下导入语句均为import kotlin.jvm.Synchronized,此现象如何解释?

这是Kotlin多平台的预期设计:

  • kotlin-stdlib-common中包含了@Synchronized的基础定义(仅作为标记注解,无具体实现逻辑),供common代码引用;
  • kotlin-stdlib-js中也提供了同名同包的@Synchronized注解,作用是在JS编译阶段标记该注解无需处理;
  • Kotlin的导入解析机制会根据当前模块的目标平台,自动关联到对应stdlib中的注解实现,但为了保持代码的跨平台一致性,统一使用import kotlin.jvm.Synchronized这一条导入语句,无需针对不同平台修改导入路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:06