一、Go允許百萬級別的 goroutines,而Java只允許數千級別的threads的原因
Go允許百萬級別的goroutines,而Java只允許數千級別的threads是因為它們所使用的線程模型不同。Java采用操作系統線程來處理線程調度,而每個操作系統線程都有一個固定大小的棧,這限制了線程的數量。而Go采用自己的調度器和動態增加/減少的棧,使得每個goroutine只需要大約4KB的棧空間。此外,Go的調度器能夠智能地進行觀察,只有當goroutine能夠執行有用的工作時才進行調度,這樣可以避免大量的上下文切換和延遲。因此,Go的并發能力比Java更高,能夠支持百萬級別的goroutines。
二、Go語言
Go語言(或 Golang)起源于 2007 年,并在 2009 年正式對外發布。Go 是非常年輕的一門語言,它的主要目標是“兼具 Python 等動態語言的開發速度和 C/C++ 等編譯型語言的性能與安全性”。Go語言是編程語言設計的又一次嘗試,是對類C語言的重大改進,它不但能讓你訪問底層操作系統,還提供了強大的網絡編程和并發編程支持。Go語言的用途眾多,可以進行網絡編程、系統編程、并發編程、分布式編程。
Go語言的推出,旨在不損失應用程序性能的情況下降低代碼的復雜性,具有“部署簡單、并發性好、語言設計良好、執行性能好”等優勢,目前國內諸多 IT 公司均已采用Go語言開發項目。Go語言有時候被描述為“C 類似語言”,或者是“21 世紀的C語言”。Go 從C語言繼承了相似的表達式語法、控制流結構、基礎數據類型、調用參數傳值、指針等很多思想,還有C語言一直所看中的編譯后機器碼的運行效率以及和現有操作系統的無縫適配。
Go語言特點:
1、代碼風格統一:Go 語言提供了一套格式化工具——go fmt。一些 Go 語言的開發環境或者編輯器在保存時,都會使用格式化工具進行修改代碼的格式化,這樣就保證了不同開發者提交的代碼都是統一的格式。
2、執行性能好:Go語言是一門編譯型的語言,我們編寫好的代碼直接編譯成服務器可以執行的二進制可執行文件。
3、開發效率高:Go語言雖然是一門編譯型的語言,但是它內置了垃圾回收機制,降低了開發者的心智負擔,使其擁有像Python、PHP等解釋性語言的一樣的開發效率。真正實現了開發效率和執行效率的完美結合。
4、天生支持并發:Go于2009年發布,當時多核處理器已經上市。Go語言在多核并發上擁有原生的設計優勢,Go語言從底層原生支持并發,無須第三方庫、開發者的編程技巧和開發經驗。
三、Java語言
Java 是一個通用術語,用于表示 Java 軟件及其組件,包括“Java 運行時環境 (JRE)”、“Java 虛擬機 (JVM)”以及“插件”。Java具有大部分編程語言所共有的一些特征,被特意設計用于互聯網的分布式環境。Java具有類似于C++語言的形式和感覺,但它要比C++語言更易于使用,而且在編程時徹底采用了一種以對象為導向的方式。
Java語言特點:
1、面向對象:Java 是一種面向對象的語言,它對對象中的類、對象、繼承、封裝、多態、接口、包等均有很好的支持。為了簡單起見,Java 只支持類之間的單繼承,但是可以使用接口來實現多繼承。使用 Java 語言開發程序,需要采用面向對象的思想設計程序和編寫代碼。
2、平臺無關性:平臺無關性的具體表現在于,Java 是“一次編寫,到處運行(Write Once,Run any Where)”的語言,因此采用 Java 語言編寫的程序具有很好的可移植性,而保證這一點的正是 Java 的虛擬機機制。在引入虛擬機之后,Java 語言在不同的平臺上運行不需要重新編譯。Java 語言使用 Java 虛擬機機制屏蔽了具體平臺的相關信息,使得 Java 語言編譯的程序只需生成虛擬機上的目標代碼,就可以在多種平臺上不加修改地運行。
3、簡單性:Java 語言的語法與 C 語言和 C++ 語言很相近,使得很多程序員學起來很容易。對 Java 來說,它舍棄了很多 C++ 中難以理解的特性,如操作符的重載和多繼承等,而且 Java 語言不使用指針,加入了垃圾回收機制,解決了程序員需要管理內存的問題,使編程變得更加簡單。
4、解釋執行:Java 程序在 Java 平臺運行時會被編譯成字節碼文件,然后可以在有 Java 環境的操作系統上運行。在運行文件時,Java 的解釋器對這些字節碼進行解釋執行,執行過程中需要加入的類在連接階段被載入到運行環境中。
5、多線程:Java 語言是多線程的,這也是 Java 語言的一大特性,它必須由 Thread 類和它的子類來創建。Java 支持多個線程同時執行,并提供多線程之間的同步機制。任何一個線程都有自己的 run() 方法,要執行的方法就寫在 run() 方法體內。
6、分布式:Java 語言支持 Internet 應用的開發,在 Java 的基本應用編程接口中就有一個網絡應用編程接口,它提供了網絡應用編程的類庫,包括 URL、URLConnection、Socket 等。Java 的 RIM 機制也是開發分布式應用的重要手段。
7、健壯性:Java 的強類型機制、異常處理、垃圾回收機制等都是 Java 健壯性的重要保證。對指針的丟棄是 Java 的一大進步。另外,Java 的異常機制也是健壯性的一大體現。
8、高性能:Java 的高性能主要是相對其他高級腳本語言來說的,隨著 JIT(Just in Time)的發展,Java 的運行速度也越來越高。
9、安全性:Java 通常被用在網絡環境中,為此,Java 提供了一個安全機制以防止惡意代碼的攻擊。除了 Java 語言具有許多的安全特性以外,Java 還對通過網絡下載的類增加一個安全防范機制,分配不同的名字空間以防替代本地的同名類,并包含安全管理機制。
延伸閱讀1:goroutine
在go語言中,每一個并發的執行單元叫做goroutine,如果一個程序中包含多個goroutine,對兩個函數的調用則可能發生在同一時刻。相關概念:
main goroutine:當一個程序啟動時,其主函數即在一個單獨的goroutine中運行,我們叫他為main gorountinego goroutine:新的goroutine會用go語句來創建,go+函數名,go語句會使其語句中的函數在一新創建的goroutine中運行,而go語句本身會迅速地完成goroutine的退出:主函數返回時,所有的goroutine都會被直接打斷,程序退出,除了從主函數退出或者終止程序之外,沒有其他方法能夠讓一個goroutine來打斷另一個的執行,但是可以通過另一種方式來實現這個目的,通過goroutine之間的通信來讓一個goroutine請求其他的goroutine,并讓請求的goroutine自行結束執行。