java虛擬機(jvm)如何實現多線程


  記得年前被同事問道“java是如何實現多線程?在網上搜索,基本上通篇都是源代碼?什么集成Thread類,什么實現Runnable接口啊,但是原理是什么呢?”

  當時這個問題讓我沉思了一下,可能很多java程序員只是處於一個會寫java代碼的階段,但是對java底層或者虛擬機沒有深入的了解過。現在我就用我的理解簡單描述一下java是如何在底層實現多線程的,如有不對之處希望大家指出錯誤,共同進步。

  要搞清楚java如何實現多線程,就要弄明白java的程序是如何運行的?

  java虛擬機(jvm)在執行java程序的過程中會把所管理的內存划分為若干個不同的數據區域,如下圖。

  數據區域共分為:java虛擬機棧,本地方法棧,程序計數器,堆,方法區。

  由於本次的重點是java如何實現多線程,所以主要說明一下程序計數器,其他區域下一次會詳細說明。

  程序計數器是一個線程隔離的數據區,說白了就是每一個線程都會單獨開辟一塊內存區域給程序計數器,並且線程之間這塊內存區域是隔離的,是安全的。

  這塊內存區域會非常小,但是卻非常關鍵,他的主要作用是存儲一段字節碼,這段字節碼記錄的是當前線程下一條需要執行的字節碼地址。簡單點說就是,記錄着一個位置,這個位置就是當前線程下一次需要執行的代碼位置。

  然而對於一個單核cpu來說,只能同時執行一條指令,但是如何實現多線程的呢?

  這時候程序計數器就會起到決定作用了。

  java虛擬機的多線程是通過線程輪流切換分配處理執行時間的方式來實現的,在任何一個確定的時刻,一個處理器(對於多核處理器來說是一個內核)都只會執行一條程序中的指令。因此,為了線程切換后能恢復到正確的執行位置,每條線程都需要一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲。

  簡單點說,對於單核處理器,是通過快速切換線程執行指令來達到多線程的,真正處理器就能同時處理一條指令,只是這種切換速度很快,我們根本不會感知到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM