为什么没有用于同步/并发的关键字?
到目前为止,我的研究为我提供了一种解决方案,您包装了一些高级类并使用它们来处理并发。
给定一个纯Kotlin项目,如果需要一个小型的高度优化的组件来处理并发等,该怎么办?
我的印象是Kotlin是Java的辅助语言,可以用Kotlin编写90%的代码,但有一些Java代码无法用Kotlin表示。
这是正确的吗?这是原来的样子吗?
为什么没有用于同步/并发的关键字?
到目前为止,我的研究为我提供了一种解决方案,您包装了一些高级类并使用它们来处理并发。
给定一个纯Kotlin项目,如果需要一个小型的高度优化的组件来处理并发等,该怎么办?
我的印象是Kotlin是Java的辅助语言,可以用Kotlin编写90%的代码,但有一些Java代码无法用Kotlin表示。
这是正确的吗?这是原来的样子吗?
Answers:
发布带有协同程序的Kotlin 1.1,并带来了它async..await
!在Kotlin参考文档,Kotlinx Coroutines库和示例中深入了解的Couroutines中了解有关此内容的更多信息。
在Kotlin协程之外,您可以选择以下选项:
@Synchronized
和 @Volatile
注释直接映射到Java中的相同关键字synchronized
Kotlin中的块来自内联函数synchronized()
。Kotlin.concurrent
软件包和具有新功能的扩展,以及对JDK类的扩展。java.util.concurrent
软件包中的任何内容,例如ConcurrentHashMap
,CountdownLatch
,CyclicBarrier
,Semaphore
,...java.util.concurrent.locks
软件包中的任何内容,并且Kotlin具有一些扩展名,包括很酷的withLock()
扩展名功能和相似的read
/write
扩展名。的ReentrantReadWriteLock
。java.util.concurrent.atomic
,例如AtomicReference
,AtomicLong
,...wait
notify
在物体上和您拥有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(...)
}
CountDownLatch
仅移植Java示例,或者对于Kovenant,请查看lib的文档。
我会回答我自己的问题,因为对我的问题的实际答案在科特林讨论中很深。
从Java来的时候,令我感到困惑的是并发关键字不是语言关键字,而是注解吗?在我看来,像同步这样的重要概念通过注解进行处理似乎很奇怪,但是现在这很有意义了。Kotlin正朝着成为平台不可知语言的方向发展,它不仅会在jvm上运行,而且会在几乎所有平台上运行。因此,同步和易变是针对jvm的,所以在javascript中可能不需要它们。
简而言之,kotlin具有Java具备的所有功能(包可见性除外)以及更多,协同程序是其他语言所没有的巨大差异。但是没有什么可以用Kotlin不能用Java编写的...(据我所知)