《剖析Java線程究竟是並行仍是併發》

 

咱們都知道線程是最基本的執行單元,包含在進程內部,也就是說,進程是由線程構成。那麼當咱們編寫多線程的時候,大部分教科書上都是稱其爲併發,而非是並行,這2種大相徑庭的概念,徹底誤導了一些同窗。javascript

 

併發:多線程運行在同一個CPU內,CPU不停作上下文切換執行任務,單位時間內只有一個線程在運行;java

並行:多線程運行在多核心CPU內,同時執行任務;面試

 

在筆者面試過的部分開發人員中,有些人會以爲Java線程被包裹在1個JVM進程內部,然而一個JVM進程運行在某一個CPU上,那麼Java的線程就是併發的,只有利用特殊API好比fork-join等框架寫出來的代碼纔是高深的並行代碼,bullshit!多線程

 

來看看下面這段代碼:併發

Java代碼 app

 收藏代碼

  1. for (int i = 0; i < 100; i++) {  
  2.  new Thread(() -> {  
  3.   for (int j = 0; j < Integer.MAX_VALUE; j++)  
  4.    UUID.randomUUID().toString();  
  5.  }).start();  
  6. }  

 

你們以爲是並行,仍是併發,先來看看CPU負載:框架

是的,你沒看錯,我這就是Alienware 17寸頂配的CPU I7 6820-HK,筆記本CPU中的王者。dom

 

當多線程在跑時,全部的CPU核心都有負載,也就是說,線程確實是並行的。解釋一下,現代操做系統是將線程最爲最小的調度單位(由內核負責管理),進程做爲資源分配的最小單位。因爲進程是不活動的,只是純粹做爲存儲線程的容器。也就是說,Java線程儘管被包裹在JVM進程內部,可是CPU調度的是進程中的線程。spa

相關文章
相關標籤/搜索