为什么 Kotlin 中没有并发关键字?
为什么没有同步和并发的关键字?
到目前为止,我的研究给了我一个解决方案,你包装一些高级类,并使用它们来处理并发性。
给定一个纯 Kotlin 中的项目,如果需要一个以线程安全的方式处理并发性的小型、高度优化的组件,该怎么办?
我的印象是,Kotlin 是 Java 的辅助语言,在 Kotlin 中编写 90% 的代码,但有一些 Java 代码是 Kotlin 无法表达的。
这是对的吗?这是它本来的样子吗?
为什么没有同步和并发的关键字?
到目前为止,我的研究给了我一个解决方案,你包装一些高级类,并使用它们来处理并发性。
给定一个纯 Kotlin 中的项目,如果需要一个以线程安全的方式处理并发性的小型、高度优化的组件,该怎么办?
我的印象是,Kotlin 是 Java 的辅助语言,在 Kotlin 中编写 90% 的代码,但有一些 Java 代码是 Kotlin 无法表达的。
这是对的吗?这是它本来的样子吗?
带有 Coroutines 的 Kotlin 1.1 发布,它带来了它!在 Kotlin 参考文档、Kotlinx Coroutines 库和这个深度的 Couroutines by Example 中阅读更多相关信息async..await
在 Kotlin 协程之外,您有以下选择:
@Synchronized
和@Volatile
注释,这些注释直接映射到Java中的相同关键字同步
块。synchronized()
Kotlin.concurrent
包和扩展,具有新功能,以及 JDK 类的扩展。java.util.concurrent
包中的任何内容,例如 、 、 、 、 ...ConcurrentHashMap
CountdownLatch
CyclicBarrier
Semaphore
java.util.concurrent.locks
包中的任何内容,Kotlin 对其中一些扩展进行了扩展,包括 cool withLock()
扩展函数和类似的读
/写
扩展。ReentrantReadWriteLock
java.util.concurrent.atomic
包中的任何内容,例如, , ...AtomicReference
AtomicLong
等待
和通知
对象
你拥有Java拥有的一切,甚至更多。您的短语“同步和锁定”被上面的列表满足了,然后您拥有更多并且没有语言更改。任何语言功能只会让它更漂亮一些。
因此,您可以使用小型Kotlin运行时,JDK中的JVM运行时以及要使用的任何其他JVM库,拥有100%的Kotlin代码。不需要Java代码,只需要Java(as-in JVM)库。
一些功能的快速示例:
class SomethingSyncd {
@Synchronized fun syncFoo() {
}
val myLock = Any()
fun foo() {
synchronized(myLock) {
// ... code
}
}
@Volatile var thing = mapOf(...)
}
我将回答我自己的问题,因为我的问题的实际答案是在kotlin讨论的某个地方。
当时我从Java开始感到困惑的是,并发关键字不是语言关键字,而是注释?对我来说,通过注释来处理同步等重要概念似乎很奇怪,但现在它变得非常有意义。Kotlin 正朝着与平台无关的语言的方向发展,它不仅适用于 JVM,而且几乎适用于其他任何东西。因此,同步和易失性对于JVM来说非常具体,例如在javascript中可能不需要它们。
简而言之,Kotlin 拥有 Java 所拥有的一切(除了包可见性),还有更多,一个没有其他语言的巨大区别是协程。但是你不能用Java编写任何你在Kotlin中做不到的事情......(据我所知)