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