
## 一、CPU角度的并發與并行

**并發**
曾經我作為一個不是很愛學習的孩子,在上學的時候經常做這樣的事情:在數學課上補物理作業,數學課聽懂了,物理作業也上交了。不謙虛的說,我是具備這樣的能力,但很可惜沒用對地方。
很多同學說:“你是不是有多個大腦?”,肯定不是啊,其實這是一種切換的能力。當你同時做多件事情,并且能夠快速切換的時候。在別人開來,你就有了并發的能力,但是你的大腦還是一個大腦。
我們的計算機在絕大部分時間都運行很多很多的進程與線程,所以CPU并發執行并切換**分配CPU時間片資源**是一種常態。只是CPU的執行速度實在是太快了,快到絕大部分情況下你都無法感知“執行線程的切換”。所以看上去它在一邊播放音樂,一邊運行瀏覽器,一邊運行其他軟件。
**并行**
知道了計算機中并發的概念,我們來舉例了解一下并行的概念。
* 你在餐廳點餐,點餐后等餐的同時你在讀書。看上去你是在做兩件事,等餐和讀書。實際上只有一件事是需要你實際操作的,那就是讀書;另外一件事實際上是做菜,做菜是由餐廳的廚師進行的。
隨著計算機多核CPU的普及,計算機也在一定程度上具備了并行計算的能力。那這么說,單核心的CPU就一定不存在并行能力嘍?也并非完全如此,若單核心的CPU擁有**Hyper-threading**技術,那么單核心可以并行的運行兩個邏輯線程。
## 二、線程角度的并發與并行
上面的并發與并行的解釋更多的是從CPU運行的角度,但作為程序員更關心的是作為開發者如何區分并發與并行。
從線程的角度去談并行,通常是指在多線程間不存在數據共享或通信,能夠利用CPU的并行能力去運行多線程。

從線程的角度去談并發,通常是指多個線程之間存在資源共享(內存、代碼段等),彼此協調共享資源的使用,從而交出或獲得CPU執行時間片的使用權。

總結一句話吧,希望對你與理解并發與并行有幫助,**并發是看上去的并行,實際上的資源切換,并發目的是將資源利用能力最大化、最優化。**
- 線程
- 1.進程和線程-鎖與信號量
- 2.Thread類線程狀態轉換
- 2.并發與并行-同步與異步
- 4.線程池
- 5.對象級別與類級別的同步鎖
- 6.創建線程的四種方式
- 7.臨界區-阻塞-活鎖-死鎖
- 2.JMM多線程模型
- JUC
- BlockingQueue
- ArrayBlockingQueue
- DelayQueue
- LinkedBlockingQueue
- PriorityBlockingQueue
- SynchronousQueue
- BlockingDeque
- ConcurrentHashMap
- CountDownLatch
- CyclicBarrier
- Exchanger
- AtomicInteger
- Lock
- Condition
- ReentrantLock讀寫鎖
- StampedLock
- Semaphore