Kotlin 官方為什麼不再強調「協程是輕量級執行緒」了?

你還在說「協程是輕量級執行緒」嗎?Kotlin 官方已經不這麼定義了。


一、早期的說法:協程 = 輕量級執行緒

Kotlin 1.1 剛推出協程時,官方文件裡直接寫著:

"Coroutines are light-weight threads."

Kotlin 1.1 Coroutines 官方文件

當時這樣宣傳完全合理。那幾年大家還在被 Thread、AsyncTask、RxJava Scheduler、callback hell 折磨,Kotlin 需要一個最容易傳播的比喻:

  • 執行緒很貴(系統呼叫、堆疊記憶體、上下文切換)
  • 協程很便宜(幾乎零成本建立,輕鬆開幾十萬個)

於是「輕量級執行緒」成了最廣為流傳的定義。


二、現在官方怎麼說的?

打開目前版本的 Kotlin Coroutines Basics 文件,你會發現措辭明顯變了:

舊文件(1.1 時期)新文件(目前)Coroutines are light-weight threads.A coroutine is an instance of a suspendable computation.強調:lightweight、thread強調:suspendnon-blockingstructured concurrency官方不再把協程定義為「執行緒的輕量版」,而是重新定義為:

一段可掛起的運算(suspendable computation)。

核心詞從 thread 變成了 suspend


三、為什麼要改?因為「輕量級執行緒」容易讓人誤解

誤解一:協程就是執行緒

協程不是 OS Thread,不是 JVM Thread,不參與 CPU 排程。它的底層是 Continuation(延續)+ 狀態機,跟執行緒是完全不同的抽象層次。

誤解二:協程的價值是「效能」

很多人以為協程解決的是執行緒效能問題。實際上,協程的首要價值是讓非同步程式碼變得可讀,資源效率只是附帶的收益。

回呼地獄:

image.png

協程寫法:

image.png

程式碼從「跳來跳去」變回了「從上往下」。這才是協程最大的勝利。


四、協程的底層到底是什麼?

Kotlin 編譯器會把 suspend 函數改寫成狀態機

原始碼:

image.png

編譯後的偽程式碼(簡化版):

image.png

關鍵點:

  • suspend 的本質是保存當前執行狀態,然後 return
  • 恢復時從上次的 label 繼續執行
  • 整個過程不需要額外的執行緒或執行緒堆疊

所以有人說:

Coroutine is not a lightweight thread. Coroutine is a lightweight continuation.

協程真正便宜的不是「執行緒變輕了」,而是 continuation 本身就極輕——只需要保存幾個區域變數和一個狀態標記。


五、現在官方真正強調的東西

1. Structured Concurrency(結構化並發)

image.png

父協程取消 → 子協程全部取消。不會有「野生協程」洩漏。

2. Cancellation Propagation(協作式取消)

image.png

3. Suspend 語義

image.png

suspend 關鍵字告訴呼叫端:「這個函數可能非同步掛起,但你可以像同步程式碼一樣呼叫它。」這是 Kotlin 最大的語言級價值。

4. Flow / Channel

完整的非同步資料流生態,已經遠超「輕量級執行緒」的範疇。


六、總結

Kotlin 官方並沒有完全刪除「lightweight thread」這個說法,但已經不再把它作為核心定義

因為協程的本質不是:

  • 更輕的執行緒

而是:

  • Suspend(可掛起)
  • Continuation(延續/狀態機)
  • Structured Concurrency(結構化並發)
  • Non-blocking(非阻塞)
  • Async Semantics(非同步語義)

所以,更準確的理解應該是:

協程不是輕量級執行緒,而是一種語言級的可掛起並發模型。


原文出處:https://juejin.cn/post/7638297326452441134


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝16   💬11   ❤️1
525
🥈
alicec
📝1   ❤️2
72
🥉
我愛JS
💬1  
4
#5
Gigi
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登