Java將增加虛擬執行緒,挑戰Go協程

我們知道 Go 語言最大亮點之一就是原生支援並發,這得益於 Go 語言的協程機制。一個 go 語句就可以發起一個協程 (goroutin)。
協程本質上是一種用戶態執行緒,它不需要作業系統來進行調度,而是由用戶程式自行管理和調度。它寄存於執行緒中,系統開銷極小,可以顯著的提高性能和並發能力。使用協程的優點是運行效率高、編程簡單、結構清晰。目前,原生支援協程的語言不是很多。

Oracle 本周提交的一份JDK增強建議(JEP)草案要求將虛擬執行緒作為Java標準版的一部分進行預覽。
虛擬執行緒類似於 Go 語言的協程,將補充Java的平台執行緒(代表作業系統執行緒),採用輕量級的用戶模式執行緒實現,將更有效地利用可用的硬體,並大大降低成本。
虛擬執行緒目的是更好地支援編寫和維護高吞吐量並發應用程式。

該提案指出,執行緒對於代表一個並發單元(如事務)是很有用的。Java目前對Thread的實現是為每個Java執行緒消耗一個作業系統執行緒,而作業系統執行緒是稀缺和昂貴的。現代伺服器的能力可以處理比作業系統執行緒更多數量級的並發事務。

編寫高吞吐量伺服器軟體的開發者不得不在事務之間共享執行緒,以有效利用硬體。這是用執行緒池來完成的,它將執行緒借給一個又一個事務,以節省為每個事務創建執行緒的成本。當這還不夠時,開發人員開始將執行緒返回到執行緒池中,甚至在事務的中間,在等待I/O的時候。但是,這導致了一種非同步的編程風格,需要一套獨立的、不兼容的API,並使故障排除、調試、觀察和分析變得非常困難。

虛擬執行緒是java.lang.Thread的用戶模式實現,它不會阻塞作業系統執行緒,能夠實現接近最佳的硬體利用率。虛擬執行緒允許高水平的並發,以及高吞吐量,同時程式仍然與Java平台和工具的基於執行緒的設計相協調。虛擬執行緒對於平台執行緒來說,就像虛擬記憶體對於物理RAM一樣:一種通過自動映射到底層物理資源而提供豐富的 “虛擬 “資源的機制。

該提案指出,使用虛擬執行緒不需要學習新的編程模型。使用Java編寫並發應用程式的開發者已經知道這個模型。然而,開發人員需要改變由於執行緒的高成本而產生的舊習慣,特別是使用執行緒池,這些執行緒池只有在它們所彙集的資源稀缺或創建成本高昂時才有用。

虛擬執行緒是由JDK實現的java.lang.Thread的實例,它允許許多活動實例在同一進程中共存。虛擬執行緒的語義與平台執行緒相同,只是它們屬於單一的ThreadGroup,不能被枚舉。

 

參考資料:

1. 進程、執行緒和協程的區別

2. 編程寶庫