多平台Kotlin代码应该使用什么样的多平台锁或同步方式?以前在Java代码中我使用synchronized
,我也可以在Kotlin中看到synchronized
。但是,它被标记为Deprecated,并将很快从common
标准库中删除。
我可以看到withLock
,但它只在JVM上受支持,不支持多平台。
有什么想法吗
PS.现在我们不想迁移到Kotlin协程,因为有太多的重写和协程库占用空间(对于有严格磁盘占用要求的Android库来说太大了)。
多平台Kotlin代码应该使用什么样的多平台锁或同步方式?以前在Java代码中我使用synchronized
,我也可以在Kotlin中看到synchronized
。但是,它被标记为Deprecated,并将很快从common
标准库中删除。
我可以看到withLock
,但它只在JVM上受支持,不支持多平台。
有什么想法吗
PS.现在我们不想迁移到Kotlin协程,因为有太多的重写和协程库占用空间(对于有严格磁盘占用要求的Android库来说太大了)。
4条答案
按热度按时间6jjcrrmo1#
来自Kotlin/Native Concurrent文档(here):
Kotlin/Native中的并发
Kotlin/Native运行时不鼓励使用具有互斥代码块和条件变量的经典面向线程的并发模型,因为这种模型容易出错且不可靠。相反,我们建议使用一系列替代方法,允许您使用硬件并发并实现阻塞IO。这些办法如下,将在以后各节中详细阐述:
看起来锁在Kotlin/Native中并没有被设计出来。有 * 个 * 实现(参见Lock.kt),但是该类被标记为
internal
。@InternalApi
,这可能会影响其稳定性。你可能也对这个KotlinLang讨论主题感兴趣:Replacement for synchronized
t3irkdon2#
在Kotlincommon中没有锁和同步。Kotlin的方法是使用不可变的数据。你可以在JVM Native中添加你自己的期望AtomicReference在常见和实际的实现中,这将有很大的帮助。还要记住,Native中的协程目前是单线程的。另外,在Native中,你不能在线程之间共享可变状态。
clj7thdc3#
在Kotlin协程库中有完整的“锁”多平台实现。它基于atomicfu,我认为可以很容易地从那里提取,即使你真的不想依赖于完整的协程库:
iih3973s4#
最好的多平台解决方案是kotlinx-atomicfu,它是官方Kotlin库的成员。
查看其锁定功能:
kotlinx.atomicfu.locks
包提供了多平台锁定原语,不需要对Kotlin/JVM和Kotlin/JS的额外运行时依赖性,并提供了Kotlin/Native的库实现虽然它目前处于beta状态,但它已经被生产质量的库使用,如 kotlinx-coroutines 和 arrow-kt。
它是一个基于Kotlin编译器插件的低级库,因此并不总是易于使用,例如它的版本绑定到特定的Kotlin版本。