入坑準備
一、一些基本概念
1、執行緒是什麼
執行緒(英語:thread)是作業系統能夠進行運算排程的最小單位。
2、程序是什麼
程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。
3、執行緒與程序的關係
執行緒是程序實際的執行單位
4、執行緒的切換
從JVM上來理解,JVM的執行時記憶體區-
PC:程式計數器(執行緒私有)
假設執行緒A執行到一半,突然切換到執行緒B。等B分配的執行時間結束後。怎麼知道A執行到哪裡了?--從PC得知
從記憶體模型來理解:
工作記憶體是獨立的,所以執行緒之間的資料其實是獨立的。但實際上執行緒可能會呼叫到靜態變數,這部分的資料是可以多個工作執行緒讀寫的。
5、單核CPU設定多執行緒是否有意義
多執行緒概念-併發。與並行不同,並行就像是楊過和小龍女一起使出玉女劍法;併發就是小龍女自己左右互搏。。。。
所以,你如果問我單核CPU搞併發有沒有用?那我問你,小龍女自己單手用招能不能打過全真教那幾位道士?
嚴肅點。。。
計算機的效能制約點:IO、計算。IO又分很多種:記憶體、硬碟、網路、CPU快取
假設在讀硬碟的時候很慢,我是不是能在這個時候先去幹點別的。而不要讓程式呈現假死的情況?
這樣可能還不是那麼好理解,我們假設 A系統在呼叫B系統,此時B系統(具備獨立計算、IO能力,需要10秒才能返回結果)。那麼你希望A系統就卡在這10秒嗎?
6、執行緒數是不是越大越好
這就涉及效能極限值了,首先肯定不是越大越好。但是要找到合適的執行緒數,需要通過壓測。
7、執行緒數的選擇
壓測,有個教授的公式。總體上要先看當前系統是偏向計算型還是IO型,一般IO型可能就不需要選擇太多的執行緒數,計算型的可能就需要多分配些,但也不是絕對的
8、建立執行緒的幾種方式
。。。其實個人認為只有一種,new Thread。
執行執行緒的多種方式的話:
new Thread().start()
new Runable(),最終用執行緒物件或執行緒池承載執行
new Callable(),有返回物件的Runable
二、執行緒狀態
- NEW
- Runable
- TERMINATED
- Wating (LockSupport.park())
- TimedWating
- Blocked(Synchronized)
三、執行緒打斷
- stop【過時】
- interrupt、interrupted
- suspend(暫停),resume(恢復)
四、併發三大特性
- 可見性 - 其他執行緒可見,資料可共享
- 有序性 - 執行不可亂序
- 原子性 - 全部成功,全部失敗
五、鎖升級
偏向鎖(門上寫個紙條,有人在上廁所)-》自旋鎖 - 很多人都想上廁所(在門外轉悠,看啥時候能輪到自己)-》重量級鎖 - 非常多人來或者一直有人插隊(廁所所長來安排)
六、ThreadPool
- Single,有序
- Fix,固定執行緒數
- Cache,無邊界
- Schdule,定時
七、TPE原始碼
- CAS,執行緒數量和狀態通過一個原子變數的高低位來控制
- 五種狀態:
- Running 執行中
- Shutdown 關機
- Stop 停止
- Tidying 整理
- Terminated 終止