为什么没有用于同步/并发的关键字?
到目前为止,我的研究为我提供了一种解决方案,您包装了一些高级类并使用它们来处理并发。
给定一个纯Kotlin项目,如果需要一个小型的高度优化的组件来处理并发等,该怎么办?
我的印象是Kotlin是Java的辅助语言,可以用Kotlin编写90%的代码,但有一些Java语言无法用Kotlin表示。
这是正确的吗?这是原来的样子吗?
Kotlin 1.1 with
Coroutines已发布
,并带来了它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
包装和科特林有少数的这些扩展包括酷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(...)
}
为什么没有同步和并发的关键字? 到目前为止,我的研究给了我一个解决方案,你包装一些高级类,并用它们来处理并发。 给定一个纯Kotlin的项目,如果需要一个以线程安全方式处理并发的小型、高度优化的组件,应该怎么做? 我的印象是,Kotlin是Java的一种辅助语言,可以用Kotlin编写90%的代码,但有一些Java代码无法用Kotling表达。 这是对的吗?这就是它的目的吗?
这样对吗?这就是它的初衷吗?
我仍然在考虑Kotlin中的coroutines,但我想知道这是否对我的问题有些矫枉过正,即在返回数据时立即更新文本视图。异常处理使回调变得非常丑陋,我想尽可能避免这些 suspend关键字是否仅仅意味着运行库可能会挂起一个需要一段时间才能完成的函数?还是只在coroutine内启用挂起?作为一个假设,我能写吗 是否知道,如果下载了1 GB的数据,将同时调用,而则等待由填充?
在为android开发时,我有时会遇到类似这样的事情: 我不明白关键字有什么意义。
我在Android应用程序中使用coroutines时遇到了一些意想不到的行为。 假设我得到了下面的函数,它不是“suspend”。它启动辅助线程,并应该阻止调用线程,直到所有辅助线程终止: 我知道很难看,使用ReentrantLock会更好,但我有意想降低到最原始的级别。 现在,如果我在没有来自Android主线程的coroutine的情况下执行此函数,它将阻塞调用线程(预期行为): 但是,如果
我们可以编写包含或不包含的代码,如下所示。 或 的实际用途是什么?。这是内存效率更高还是可读性更强?