为什么Kotlin中没有并发关键字?


81

为什么没有用于同步/并发的关键字?

到目前为止,我的研究为我提供了一种解决方案,您包装了一些高级类并使用它们来处理并发。

给定一个纯Kotlin项目,如果需要一个小型的高度优化的组件来处理并发等,该怎么办?

我的印象是Kotlin是Java的辅助语言,可以用Kotlin编写90%的代码,但有一些Java代码无法用Kotlin表示。

这是正确的吗?这是原来的样子吗?



24
Kotlin具有同步块(kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html),同步方法(kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-synchronized),可变字段(kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/…)。它可以使用java.util.concurrent类。您到底在找什么?
JB Nizet

1
您在这里有多个问题,您应该专注于一个主题。您认为缺少哪些并发性内容,请指定听起来像我没有丢失的内容。然后,另一个问题并不是真正的SO问题,而是基于观点的(并且不是正确的断言)。
杰森·米纳德'02

1
请参阅:github.com/Kotlin/kotlinx.coroutines,以获取有关Kotlin协同程序的更新
Jayson Minard,

Answers:


141

发布带有协同程序的Kotlin 1.1,并带来了它async..await!在Kotlin参考文档Kotlinx Coroutines库示例中深入了解的Couroutines中了解有关此内容的更多信息。

在Kotlin协程之外,您可以选择以下选项:

您拥有Java拥有的一切,还有更多。你的话上面的列表满足了“同步和锁定”,因此您甚至拥有更多而且没有语言更改。任何语言功能都只会使其更漂亮。

因此,您可以使用小型Kotlin运行时,JDK中的JVM运行时以及您要使用的任何其他JVM库,获得100%的Kotlin代码。不需要Java代码,仅需要Java(作为JVM)库。

一些功能的快速样本:

class SomethingSyncd {
    @Synchronized fun syncFoo() {

    }

    val myLock = Any()

    fun foo() {
        synchronized(myLock) {
            // ... code
        }
    }

    @Volatile var thing = mapOf(...)
}

1
有什么例子吗?cos,如果我在方法上编写同步操作,就不会接受它...与volatile ...相同
2016年

2
@vach在您的问题下,我在评论中提供了链接。同步和易失性是注释。
JB Nizet

@vach,如果您尝试过使用代码,则应将其与任何错误消息一起包括在问题中。
杰森·米纳德

1
我在您的链接中合并了@JBNizet
Jayson Minard,

1
@vach我添加了与此问题相关的注释的快速示例,例如CountDownLatch仅移植Java示例,或者对于Kovenant,请查看lib的文档。
杰森·米纳德'02

3

我会回答我自己的问题,因为对我的问题的实际答案在科特林讨论中很深。

从Java来的时候,令我感到困惑的是并发关键字不是语言关键字,而是注解吗?在我看来,像同步这样的重要概念通过注解进行处理似乎很奇怪,但是现在这很有意义了。Kotlin正朝着成为平台不可知语言的方向发展,它不仅会在jvm上运行,而且会在几乎所有平台上运行。因此,同步和易变是针对jvm的,所以在javascript中可能不需要它们。

简而言之,kotlin具有Java具备的所有功能(包可见性除外)以及更多,协同程序是其他语言所没有的巨大差异。但是没有什么可以用Kotlin不能用Java编写的...(据我所知)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.