为什么没有关键字用于同步/并发?
到目前为止,我的研究给了我一个解决方案,你包装一些高级类并使用它们来处理并发。
鉴于纯Kotlin中的项目,如果需要一个处理并发性的小型高度优化组件,该怎么办?
我的印象是Kotlin是Java的一种辅助语言,在Kotlin中编写90%的代码,但有一些用Kotlin无法表达的java代码。
这是对的吗?这是它的目的是什么?
答案 0 :(得分:108)
Kotlin 1.1 with Coroutines was released它带来data = dataItems.Take();
!在Kotlin reference docs,Kotlinx Coroutines library中了解详情,深入了解Couroutines by Example
在Kotlin Coroutines之外,您有以下选择:
@Synchronized
和@Volatile
注释synchronized
blocks来自内联函数async..await
。Kotlin.concurrent
package and extensions个新功能,也是JDK类的扩展。java.util.concurrent
package中的任何内容,例如synchronized()
,ConcurrentHashMap
,CountdownLatch
,CyclicBarrier
,... java.util.concurrent.locks
package中的任何内容,Kotlin可以访问extensions for a few of these withLock()
extension function和Semaphore
ReentrantReadWriteLock
。 read
/write
extensions中的任何内容,例如AtomicReference
,AtomicLong
,... java.util.concurrent.atomic
package 你拥有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(...)
}
答案 1 :(得分:2)
我将回答自己的问题,因为对我的问题的实际答案在科特林讨论中很深。
从Java来的时候,让我感到困惑的是并发关键字不是它们是注释的语言关键字吗?在我看来,像同步这样的重要概念通过注解进行处理似乎很奇怪,但是现在这很有意义了。 Kotlin正朝着成为平台不可知语言的方向发展,它不仅会在jvm上运行,而且会在几乎所有平台上运行。因此,同步和易失性是jvm特有的,例如,在javascript中可能不需要它们。
简而言之,kotlin具有Java具备的所有功能(包可见性除外)以及更多其他功能,协同程序是其他语言所没有的巨大差异。但是没有什么可以用kotlin编写的,不能用Java写...(据我所知)