好程式設計師Java學習路線分享多執行緒概念

好程式設計師IT發表於2019-10-10

  好程式設計師Java 學習路線分享 多執行緒概念

  1 、程式:正在執行中的程式,其實是應用程式在記憶體中執行的那片空間。

 

  2 、執行緒:程式中的一個執行單元,負責程式中的程式的執行,一個程式中至少要有一個執行緒。一個程式中可以有多個執行緒的,這個應用程式也可以稱之為多執行緒程式。

 

  3 、程式啟動多執行緒,有什麼應用呢 ? 可以實現多個程式同時執行,專業術語稱為併發。多執行緒的使用可以合理使用 cpu 的資源,如果執行緒過多導致降低效能。

 

  4 、建立執行緒的方式兩種方式:

 

  4.1 、繼承 Thread

 

  4.1.1 、定義一個類繼承 Thread

 

  4.1.2 、重寫 run 方法

 

  4.1.3 、建立子類物件

 

  4.1.4 、啟動 start 方法

 

  4.2 、實現 Runnable

 

  4.2.1 、定義類實現 runnable 介面

 

  4.2.2 、覆蓋介面中 run 方法,將執行緒任務程式碼定義到 run 方法裡。

 

  4.2.3 、建立 Thread 類的物件。

 

  4.2.4 、將 runnable 介面的子類物件作為引數傳入 Thread 類的構造方法裡。

 

  4.2.5 、啟用 Thread 類的 start 方法。

 

  5 、執行緒物件呼叫 run 方法和呼叫 start 方法區別 ? 呼叫 run 方法不開啟執行緒,近視物件呼叫方法。呼叫 start 方法開啟執行緒,並讓 JVM 呼叫 run 方法在開啟的執行緒中執行。

 

  6 、建立執行緒的目的是什麼 ? 是為了建立單獨的執行路徑,讓多部分程式碼實現同時執行。也就是執行緒建立並執行需要給定的程式碼 ( 執行緒任務 )

 

  7 、多執行緒執行時,在棧記憶體中,其實每一個執行執行緒都有一片自己所屬的棧記憶體空間。進行方法的壓棧和彈棧。當執行執行緒的任務結束了,執行緒自動在棧記憶體中釋放了。但是當所有的執行執行緒都結束了,那麼程式就結束了。

 

  8 Thread Runnable 的區別 Runnable 介面避免了單繼承的侷限性。實現 Runnable 介面的方式,更加符合物件導向,執行緒分為兩部分,一部分執行緒物件,一部分執行緒任務。繼承 Thread 類:執行緒物件和執行緒任務耦合在一起。一旦建立 Thread 類的子類物件,既是執行緒物件,又有執行緒任務。將執行緒任務單獨分離出來封裝成物件,型別就是 runnable 介面型別。實現 Runnable 介面對執行緒物件和執行緒任務進行解耦。

 

  9 、執行緒的執行狀態被建立:執行:該狀態是執行緒具備了 CPU 執行資格的同時也具備了執行權,一個時刻只能有一個執行緒在執行。消亡:當 run 方法結束,執行緒就進入了消亡狀態。凍結:釋放了 CPU 的執行權和執行資格,有兩種方式: sieep( 休眠 ) wait( 等待 ) ,同時也有兩種方式解除此狀態, sleep( 時間到 ) notify() 要注意的時,當執行緒從凍結狀態結束後,並沒有立馬執行,只能說它獲取了 CPU 的執行資格,因為隨機性的原因,它也可能轉換成臨時阻塞狀態。臨時阻塞狀態:執行緒具備 CPU 的執行資格,不具備執行權,正等著 CPU 切換到它執行。

  10 、多執行緒的安全性問題的原因

 

  10.1 多個執行緒在操作共享的資料。

 

  10.2 執行緒任務操作共享資料的程式碼有多條 ( 運算有多個 ) 。解決問題:用同步程式碼塊 synchronized 同步的好處 : 解決多執行緒的安全問題。同步的弊端:降低了程式的效能。同步的前提:必須保證多個執行緒在同步中使用的是同一個鎖。同步的另一種體現形式:同步函式。同步函式使用的鎖是 this

 

  11 、多執行緒安全問題 - 同步函式使用的鎖和同步程式碼塊的區別同步函式使用的鎖是固定的 this 。同步程式碼塊使用的鎖可以是任意物件。

 

  12 、靜態同步函式使用的鎖不是 this ,而是位元組碼檔案物件類名 .class

 

  13 、單例設計模式 13.1 惡漢式:

 

  程式碼體現:

 

  ClassSingle{

 

  PrivtaestaticfinalSingles=newSingle();

 

  PrivateSingle(){}

 

  PublicstaticSinglegetInstance(){

 

  Returns;}

 

  }

 

  13.2 、懶漢式:延遲載入,存在著多執行緒併發訪問的安全問題,需要使用同步來解決安全問題,但是同步會降低效率,所以使用雙重 if() 判斷形式解決效率低的問題。

 

  實現程式碼:ClassSingle{

 

  PrivateSingle(){}

 

  PrivatestaticSingles=null;

 

  PublicstaticSinglegetInstance(){

 

  If(s==null){

 

  Synchroinzed(Single.class){

 

  If(s==null)S=newSingle();

 

  }Returns;}

 

  }

 

  }

 

  14 、死鎖:即同步的弊端,不是執行緒和程式沒有了,而是不動了。表現形式:同步巢狀的時候,使用的鎖不一樣,容易引發死鎖。

 

  實現程式碼:

 

  //Thread-0

 

  Synchroinzed(obj1){Synchroinzed(obj2){}}

 

  //Thread-1

 

   Synchroinzed(obj2){Synchroinzed(obj1){}}

  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2659385/,如需轉載,請註明出處,否則將追究法律責任。

相關文章