当前位置: 首页 > 知识库问答 >
问题:

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

孟鸿朗
2023-03-14

为什么没有同步和并发的关键字?

到目前为止,我的研究给了我一个解决方案,你包装一些高级类,并用它们来处理并发。

给定一个纯Kotlin的项目,如果需要一个以线程安全方式处理并发的小型、高度优化的组件,应该怎么做?

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

这是对的吗?这就是它的目的吗?

共有2个答案

段干瑞
2023-03-14

我将回答我自己的问题,因为我的问题的实际答案在kotlin讨论的某个地方。

当时来自Java时让我感到困惑的是,并发关键字不是语言关键字,而是注释?对我来说,通过注释来处理同步等重要概念似乎很奇怪,但现在它变得非常有意义。Kotlin正朝着成为一种与平台无关的语言的方向发展,它不仅适用于JVM,而且几乎适用于任何事情。因此,同步和易失性对于JVM非常具体,例如在javascript中可能不需要它们。

简而言之,Kotlin拥有Java所拥有的一切(除了包可见性)以及更多,一个其他语言没有的巨大区别是协程。但是你用Java写的东西,没有什么是你用Kotlin做不到的...(据我所知)

姜志行
2023-03-14

Kotlin 1.1与协程一起发布,它带来了异步。等待!在科特林参考文档,科特林克斯协程库和这个伟大的深入库鲁廷的例子中阅读更多关于它的信息

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

  • 科韦南图书馆增加了对科特林的promise
  • 类星体库提供轻量级线程和延续
  • @Synchronized@Volatile注释,它们直接映射到Java中的相同关键字
  • 同步块,在柯特林中来自内联函数同步()
  • Kotlin 有一个 Kotlin.concurrent 包和扩展,其中包含新的函数,并且还扩展了 JDK 类。
  • 您可以访问 java.util.concurrent 软件包中的任何内容,例如并发哈希映射倒计时缓存循环巴里耶信号量、...
  • 你可以访问java.util.concurrent.locks包中的任何内容,Kotlin有一些扩展,包括酷与Lock()扩展函数和类似的/扩展,用于重入读写锁
  • 您可以访问 java.util.concurrent.atomic 包中的任何内容,例如原子引用原子长,...
  • 您可以使用等待通知对象

你拥有Java的一切,还有更多。您的短语“同步和锁定”被上面的列表所满足,然后您就有了更多,而且没有语言更改。任何语言功能都只会让它更漂亮一点。

因此,您可以使用小型静态编程语言运行时、JDK中的JVM运行时以及您想要使用的任何其他JVM库来获得100%的静态编程语言代码。不需要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语言无法用Kotlin表示。 这是正确的吗?这是原来的样子吗? 问题答案: Kotl

  • 这样对吗?这就是它的初衷吗?

  • 我仍然在考虑Kotlin中的coroutines,但我想知道这是否对我的问题有些矫枉过正,即在返回数据时立即更新文本视图。异常处理使回调变得非常丑陋,我想尽可能避免这些 suspend关键字是否仅仅意味着运行库可能会挂起一个需要一段时间才能完成的函数?还是只在coroutine内启用挂起?作为一个假设,我能写吗 是否知道,如果下载了1 GB的数据,将同时调用,而则等待由填充?

  • 在为android开发时,我有时会遇到类似这样的事情: 我不明白关键字有什么意义。

  • 我在Android应用程序中使用coroutines时遇到了一些意想不到的行为。 假设我得到了下面的函数,它不是“suspend”。它启动辅助线程,并应该阻止调用线程,直到所有辅助线程终止: 我知道很难看,使用ReentrantLock会更好,但我有意想降低到最原始的级别。 现在,如果我在没有来自Android主线程的coroutine的情况下执行此函数,它将阻塞调用线程(预期行为): 但是,如果

  • 我们可以编写包含或不包含的代码,如下所示。 或 的实际用途是什么?。这是内存效率更高还是可读性更强?