咱們都知道線程是最基本的執行單元,包含在進程內部,也就是說,進程是由線程構成。那麼當咱們編寫多線程的時候,大部分教科書上都是稱其爲併發,而非是並行,這2種大相徑庭的概念,徹底誤導了一些同窗。javascript
併發:多線程運行在同一個CPU內,CPU不停作上下文切換執行任務,單位時間內只有一個線程在運行;java
並行:多線程運行在多核心CPU內,同時執行任務;面試
在筆者面試過的部分開發人員中,有些人會以爲Java線程被包裹在1個JVM進程內部,然而一個JVM進程運行在某一個CPU上,那麼Java的線程就是併發的,只有利用特殊API好比fork-join等框架寫出來的代碼纔是高深的並行代碼,bullshit!多線程
來看看下面這段代碼:併發
Java代碼 app
你們以爲是並行,仍是併發,先來看看CPU負載:框架
是的,你沒看錯,我這就是Alienware 17寸頂配的CPU I7 6820-HK,筆記本CPU中的王者。dom
當多線程在跑時,全部的CPU核心都有負載,也就是說,線程確實是並行的。解釋一下,現代操做系統是將線程最爲最小的調度單位(由內核負責管理),進程做爲資源分配的最小單位。因爲進程是不活動的,只是純粹做爲存儲線程的容器。也就是說,Java線程儘管被包裹在JVM進程內部,可是CPU調度的是進程中的線程。spa