Kotlin 有多平台锁吗?

Is there multiplatform lock in Kotlin?

multiplatform Kotlin 代码中应该使用什么 multiplatform Lock 或同步方法?之前在 Java 代码中我使用了 synchronized,我也可以在 Kotlin 中看到 synchronized。但是它被标记为已弃用,很快就会从 common 标准库中删除。

我可以看到 withLock,但它仅在 JVM 上受支持,在多平台上不受支持。

有什么想法吗?

PS。现在我们不想迁移到 Kotlin 协程,因为重写和协程库占用空间太多(对于具有严格磁盘占用要求的 Android 库来说太大了)。

Kotlin common 中没有锁也没有同步。 Kotlin 的做法是使用不可变数据。你可以在JVM Native中常见的和实际的实现中加入你自己的expect AtomicReference,会有很大的帮助。还要记住,Native 中的协程目前是单线程的。此外,您不能在 Native 中的线程之间共享可变状态。

来自 Kotlin/Native 并发文档 (here):

Concurrency in Kotlin/Native

Kotlin/Native runtime doesn't encourage a classical thread-oriented concurrency model with mutually exclusive code blocks and conditional variables, as this model is known to be error-prone and unreliable. Instead, we suggest a collection of alternative approaches, allowing you to use hardware concurrency and implement blocking IO. Those approaches are as follows, and they will be elaborated on in further sections:

  • Workers with message passing
  • Object subgraph ownership transfer
  • Object subgraph freezing
  • Object subgraph detachment
  • Raw shared memory using C globals
  • Coroutines for blocking operations (not covered in this document)

似乎 Kotlin/Native 中没有公开锁的设计。有 实现(参见 Lock.kt),但是 class 被标记为 internal

但是,KTOR中有一个multi-platform锁的实现(非常有限doc, source code). It is public, but marked with @InternalApi,这可能会影响它的稳定性。

您可能也对这个 KotlinLang 讨论主题感兴趣:Replacement for synchronized

Kotlin 协程库中有完整的 "lock" 多平台实现。它基于 atomicfu,我认为可以很容易地从那里提取,即使你真的不想依赖完整的协程库: