
在上學的時候,老師講到進程與線程的時候可能是這樣講的:
* 進程是一個具有一定獨立功能的程序在一個數據集上的一次動態執行的過程,是操作系統進行資源分配和調度的一個獨立單元,是應用程序運行的載體。
* 線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。

**那個時候為了考試我都背下來了,但是心里想說:what?這都是些什么東西?** 下面讓我來試著用更通俗的語言來給你說說進程、線程、互斥鎖、信號量的那些事。
## 一、房子與居住者
我們可以將自己平時住的房子類比為一個進程,每一個房間及其占用者比喻為一個線程。房子本身并不會做任何的事情,但是線程是房子里面每一個活躍的人,他們平時洗衣、做飯、看電視……,就像線程執行自己的代碼一樣在運行著。

**單線程**
單線程就是一個叫做“進程”的房子里面,只住了你一個人,你可以在這個房子里面任何時間去做任何的事情。你是看電視、還是玩電腦,全都有你自己說的算。想干什么干什么,想什么時間做什么就什么時間做什么。
**多線程**
但是如果你處在一個“多人”的房子里面,每個房子里面都有叫做“線程”的住戶:線程1、線程2、線程3、線程4,情況就不得不發生變化了。假如這些線程是你的老婆、孩子、父母。
* 父母老人午睡的時候你不能開音響
* 老婆要看“甄嬛傳”,你就不能看球賽
* 孩子沒睡覺,你就別想看書
* ……
多線程出現這些問題的根本原因在于”共享資源“:時間、電視、廁所、廚房……等等。那我們下面來看看,如何處理協調使用這些"共享資源"?
## 二、鎖(互斥鎖)
在多線程編程中有”鎖”的概念,在你的房子里面也有鎖。如果你的老婆在上廁所并鎖上門,她就是在獨享這個“房子(進程)”里面的公共資源“衛生間”,如果你的家里只有這一個衛生間,你作為另外一個線程就只能先等待。

線程對鎖的占用是有優先級的,就像在你的家里也有優先級。當你家只有一個衛生間的時候,孩子、老婆、你同時要去上廁所,通常來說 你的優先級是1,你老婆的優先級是100,你孩子的優先級是255。需要說明的是:數值越小優先級越低。但是不同的情況下會有不同的優先級調度算法,關鍵核心因子是優先級設置與等待時間,如果你確實等待了很長時間,老婆孩子可能看你快憋不住了,讓你先去使用洗手間也是可以的。
## 三、信號量
現在讓我們從衛生間走入廚房,首先我們要明確的一點是:廚房里面可以有一個人,也可以有多個人。
那我們怎么控制使用“廚房”這個公共資源的人數(線程數)?一個比較好的方法就是使用信號量。

“信號量”在編程術語中使用單詞semaphore,那什么是“信號量”?信號量就好比你家廚房入口架子上擺了三把鍋:
* 如果你的孩子熱奶拿走一把,你的老婆熱湯拿走一把,你的媽媽做菜拿走一把,你想煮面條就沒有鍋了。當你看到這種情況,你就不會進入廚房了,也就說廚房按照“鍋的數量”作為信號量,只能容納三個人(線程)。
* 當你的老婆熱完湯之后,把鍋重新放回架子上,你就可以去獲得一個鍋,你就可以進入廚房了。
所以說:當信號量總數為1的時候,也就是你家只有一把鍋,此時信號量作用就等同于互斥鎖。
## 四、專業點好么
來一張專業點的圖,別讓您誤會我是講故事的。講技術,我可是認真的!

參考:[http://www.qnx.com/developers/docs/6.4.1/neutrino/getting\_started/s1\_procs.html](http://www.qnx.com/developers/docs/6.4.1/neutrino/getting_started/s1_procs.html)
[https://www.cnblogs.com/qianqiannian/p/7010909.html](https://www.cnblogs.com/qianqiannian/p/7010909.html)
* [《手摸手教你學Spring Boot2.0》]( http://www.hmoore.net/hanxt/springboot2/content )
* [《Spring Security-JWT-OAuth2一本通》](http://www.hmoore.net/hanxt/springsecurity/content)
* [《實戰前后端分離RBAC權限管理系統》](http://www.hmoore.net/hanxt/vue-spring/content)
* [《實戰SpringCloud微服務從青銅到王者》](http://www.hmoore.net/hanxt/springcloud/content)
* [《VUE深入淺出系列》](http://www.hmoore.net/hanxt/vuejs2/content)
- 線程
- 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