為什麼說Java天生支援多執行緒
阿新 • • 發佈:2019-02-06
Java的執行緒是由jvm來管理的,它如何對映到作業系統的執行緒是由jvm實現來決定的。
lwp輕量級程序是對核心執行緒的一層封裝,提供給使用者執行緒呼叫,使用者執行緒即為程式語言實現的一套執行緒機制。
協程是在程式語言層面實現的,使用yield關鍵字,類似於組合語言的跳轉,協程也有自己的暫存器等,只不過這些都是有自己進行控制,協程從屬於執行緒,一個執行緒可以有很多歌協程,這樣就避免了執行緒上下文切換的開銷,因協程是在一個執行緒裡,所以也不存在鎖,效率比較高,能夠支援很多併發,但不能利用多核cpu資源,Java可以採用多執行緒+協程方式實現更多的併發操作。
jvm正是被設計成採用lwp(輕量級程序)來實現與作業系統的核心執行緒形成一比一的對映關係,來實現Java內部的多執行緒,並提供了相應的語法來進行編碼,其實呼叫Java的多執行緒就是呼叫核心執行緒來執行,所以說Java 天生是支援多執行緒的語言。
但核心執行緒都有一個核心執行緒棧,用來儲存執行一系列方法的臨時空間,並且執行緒棧之間是不共享的,每個棧會使用一定的記憶體空間,Java棧預設1024k,所以一個jvm開1024執行緒,執行緒棧至少就會耗掉1G的記憶體空間,由於這個限制,執行緒也不能開的過多,並且作業系統對每個程序能開的核心執行緒數量也是有限制的。Java執行緒與核心執行緒的對映圖如下: