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

KMP iOS源集无法使用@Volatile与synchronized的解决方法咨询

解决KMP iOS源集无法使用@Volatile和synchronized的问题

一、@Volatile报错的解决

报错原因:你在iOS源集直接使用了common模块专属的@OptionalExpectation标注的@Volatile注解,该注解仅用于common模块的期望声明,不能在平台源集直接使用。

解决步骤:

  1. 在common模块声明期望的volatile属性
    使用expect关键字定义包含volatile属性的类或属性:

    // commonMain/kotlin/...
    expect class SharedState {
        @Volatile
        var value: Int
    }
    

    这里的@Volatile是kotlin-stdlib提供的跨平台期望注解。

  2. 在iOS源集提供平台特定实现
    导入Kotlin/Native的@Volatile注解,实现actual类:

    // iosMain/kotlin/...
    import kotlin.native.concurrent.Volatile
    
    actual class SharedState {
        @Volatile
        actual var value: Int = 0
    }
    

    Kotlin/Native的@Volatile会确保属性的读写操作是原子性且可见的,符合iOS平台的线程安全要求。

二、synchronized报错的解决

报错原因:synchronized是JVM平台特有的函数,Kotlin/Native(iOS)没有内置该函数,因此无法直接调用。

解决方式有两种:

方式1:跨平台封装synchronized函数

通过expect/actual机制在各平台实现同步逻辑:

  1. common模块声明期望函数
    // commonMain/kotlin/...
    expect fun <T> synchronized(lock: Any, block: () -> T): T
    
  2. JVM源集直接复用原生实现
    // jvmMain/kotlin/...
    actual fun <T> synchronized(lock: Any, block: () -> T): T = kotlin.synchronized(lock, block)
    
  3. iOS源集用Mutex实现同步
    // iosMain/kotlin/...
    import kotlin.native.concurrent.Mutex
    import kotlin.native.concurrent.freeze
    
    // 为每个锁对象关联一个Mutex,确保线程安全
    private val mutexCache = mutableMapOf<Any, Mutex>().freeze()
    
    actual fun <T> synchronized(lock: Any, block: () -> T): T {
        val mutex = mutexCache.getOrPut(lock) { Mutex().freeze() }
        return mutex.withLock(block)
    }
    
    这里使用Kotlin/Native的Mutex类实现同步块,freeze()是为了确保对象在多线程环境下安全访问。

方式2:直接在iOS代码中使用平台原生同步机制

如果不需要跨平台统一调用,也可以直接用iOS原生的NSLock:

// iosMain/kotlin/...
import platform.Foundation.NSLock

private val lock = NSLock()

fun doThreadSafeOperation() {
    lock.lock()
    try {
        // 线程安全的操作逻辑
    } finally {
        lock.unlock()
    }
}

内容的提问来源于stack exchange,提问作者Anmol Singh Sahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:09:29