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