1. 程式人生 > 其它 >入坑準備

入坑準備

一、一些基本概念

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 終止