Kotlin中有多平台锁吗?

64jmpszr  于 2023-05-07  发布在  Kotlin
关注(0)|答案(4)|浏览(203)

多平台Kotlin代码应该使用什么样的多平台锁或同步方式?以前在Java代码中我使用synchronized,我也可以在Kotlin中看到synchronized。但是,它被标记为Deprecated,并将很快从common标准库中删除。

我可以看到withLock,但它只在JVM上受支持,不支持多平台。
有什么想法吗
PS.现在我们不想迁移到Kotlin协程,因为有太多的重写和协程库占用空间(对于有严格磁盘占用要求的Android库来说太大了)。

6jjcrrmo

6jjcrrmo1#

来自Kotlin/Native Concurrent文档(here):

Kotlin/Native中的并发

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

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

看起来锁在Kotlin/Native中并没有被设计出来。有 * 个 * 实现(参见Lock.kt),但是该类被标记为internal

  • 然而 *,KTOR中有多平台的锁实现(非常有限的docsource code)。它是公共的,但标记为@InternalApi,这可能会影响其稳定性。

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

t3irkdon

t3irkdon2#

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

clj7thdc

clj7thdc3#

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

iih3973s

iih3973s4#

最好的多平台解决方案是kotlinx-atomicfu,它是官方Kotlin库的成员。
查看其锁定功能:
kotlinx.atomicfu.locks包提供了多平台锁定原语,不需要对Kotlin/JVM和Kotlin/JS的额外运行时依赖性,并提供了Kotlin/Native的库实现

  • SynchronizedObject是为继承而设计的。
  • ReentrantLock是为委托而设计的。

虽然它目前处于beta状态,但它已经被生产质量的库使用,如 kotlinx-coroutinesarrow-kt
它是一个基于Kotlin编译器插件的低级库,因此并不总是易于使用,例如它的版本绑定到特定的Kotlin版本。

相关问题