Kotlin相关原理解析

124 阅读1分钟

inline、noline、crossinline

  • inline: 内联函数:编译时,会将函数体直接映射到函数调用处,内联函数适合高阶函数,对普通函数影响微不足道。因为高阶函数使用Lambda被替换成了匿名类,消耗性能
  • noline: 使函数参数不被内联
  • crossinline: 修饰inline函数参数的。当高阶函数被inline修饰时,调用内联函数时,可以直接return(全局返回)中断lambda表达式,此时用crossinline修饰内联函数的参数,可以禁止在Lambda表达式使用全局return返回 详解

协程原理

  • suspend本质是callBack ,kotlin里叫Continuation(续体)

  • Continuation:接下来需要执行的代码or剩下来的代码 suspend方法反编译会形成一个 带形参continution 的方法

public interface Continuation<in T> {
  public val context: CoroutineContext
      //相当于 onSuccess     结果
      public fun resumeWith(result: Result<T>)
  }
  • suspend方法返回值是个Any,标志函数有没有被挂起。(因为可能返回是枚举、"no suspend"、null所以定义为Any) testCor()方法内部会调用invokeSuspend()方法,invokeSuspend嵌套testCor()方法

  • 内部维护有两个字段label(状态机,可理解为每一个supsend方法是一个case状态)result(协程返回值) 当执行一个伪supsend方法,会重新走一遍Switch切换到下一个状态机

  • 他们公用同一个Continuation实例(轻量级)

  • 协程完全由开发者管理,不涉及操作系统的调度和切换,因此高效

  • 子线程往主线程切换依靠HandlerContext(子持有父协程体),而子线程切换依赖线程池