Kotlin 中是否有跨平台的锁?

11
在多平台Kotlin代码中应该使用什么多平台锁定或同步方法?以前在Java代码中,我使用了`synchronized`,我在Kotlin中也可以看到synchronized。然而,它被标记为废弃的,并将很快从`common` std lib中删除。
我可以看到withLock,但它只支持JVM,而不是多平台。
有什么想法吗?
PS. 目前我们不想迁移到Kotlin协程,因为需要大量重写和协程库足迹(对于具有严格磁盘足迹要求的Android库来说太大)。
4个回答

5
从 Kotlin/Native 并发文档(这里):

Kotlin/Native中的并发性

Kotlin/Native运行时不鼓励传统的基于线程的互斥代码块和条件变量的并发模型,因为已知该模型容易出现错误且不可靠。相反,我们建议使用一组另类方法,允许您使用硬件并发并实现阻塞IO。这些方法如下,将在后续章节中详细阐述:

  • 带有消息传递的工作器
  • 对象子图所有权转移
  • 对象子图冻结
  • 对象子图分离
  • 使用C全局变量的原始共享内存
  • 用于阻塞操作的协程(本文档未涉及)
根据设计,似乎 Kotlin/Native 中并没有暴露锁。虽然有实现(请参见Lock.kt),但是该类被标记为 internal
然而,KTOR 中有跨平台的锁实现(非常有限的文档源代码)。它是公开的,但标记为@InternalApi,这可能会影响其稳定性。
您还可能对这个 KotlinLang 讨论线程感兴趣:Replacement for synchronized

4

Kotlin common中没有锁和同步机制。Kotlin的方法是使用不可变数据。您可以在common中添加自己的expect原子引用,并在JVM Native实现中添加actual,这将有很大帮助。同时要记住,目前Native中的协程是单线程的。此外,您不能在Native中的线程之间共享可变状态。


感谢您提出“不可变性”的建议,我遇到了哈希映射的并发修改问题,因此返回一个新的HashMap解决了这个问题... - abdu

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

如何在不复制/粘贴的情况下轻松提取它们? - 4ntoine
这些实现是特定于协程的,我认为不容易“提取”它们的某个部分... - snorbi

0

最佳的跨平台解决方案是kotlinx-atomicfu,它是官方Kotlin库的成员之一。
请查看其锁定功能

kotlinx.atomicfu.locks包提供了多平台锁定原语,在Kotlin/JVM和Kotlin/JS上不需要额外的运行时依赖项,并且在Kotlin/Native上具有库实现。

  • SynchronizedObject适用于继承。
  • ReentrantLock适用于委托。

尽管它目前处于beta状态,但已经被生产质量的库如kotlinx-coroutinesarrow-kt使用。

它是一个基于Kotlin编译器插件的低级库,因此并不总是容易使用,例如它的版本与特定的Kotlin版本绑定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接