繁体   English   中英

Kotlin 中是否有多平台锁?

[英]Is there multiplatform lock in Kotlin?

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

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

有什么想法吗?

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

来自 Kotlin/Native Concurrent 文档( 这里):

Kotlin/Native 中的并发

Kotlin/Native 运行时不鼓励具有互斥代码块和条件变量的经典的面向线程的并发模型,因为已知该模型容易出错且不可靠。 相反,我们建议使用一系列替代方法,允许您使用硬件并发并实现阻塞 IO。 这些方法如下,它们将在进一步的部分中详细说明:

  • 具有消息传递功能的工人
  • 对象子图所有权转移
  • 对象子图冻结
  • 对象子图分离
  • 使用 C 全局变量的原始共享内存
  • 用于阻塞操作的协程(本文档未涵盖)

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

但是,在 KTOR 中有一个多平台的锁实现(非常有限的文档源代码)。 它是公开的,但标有@InternalApi ,这可能会影响其稳定性。

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

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

Kotlin 协程库中有完整的“锁定”多平台实现。 它基于 atomicfu,我认为可以从那里轻松提取,即使您真的不想依赖完整的协程库:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM