好程式設計師大資料學習路線分享多執行緒學習筆記

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

  好程式設計師大資料學習路線分享 多執行緒 學習筆記, 預設情況下, 主執行緒和垃圾回收執行緒都是由系統建立的 , 但是我們需要完成自己的功能 ---- 建立自己的執行緒物件

 

 * java 將執行緒物件導向了 , 形成的類就是 Thread, Thread 類內部執行任務的方法叫 run()

 *

 * 注意 : 如果想讓 run 作為任務區 , 必須讓他去被自動呼叫 . 我們透過執行 start() 方法 , 來開啟執行緒 , 繼而實現 run 方法的自動呼叫 .

 

## 直接使用 Thread 建立執行緒物件

 

//   // 分析 : 由於我們實現的實際功能 Thread 類是決定不了的 , 所以沒有辦法將我們的功能放入 Thread run 方法裡

//   // 所以 Thread run 方法是一個空方法 . 如果我們想實現自己的功能 , 可以寫 Thread 類的子類 , 重寫 run 方法

 

當我們手動呼叫run 的時候 , 他失去了任務區的功能 , 變成了一個普通的方法 .

// run 作為一個普通方法時 , 內部對應的執行緒跟呼叫他的位置保持一致 .

 

##   鎖的條件 :

 

   * 1. 鎖必須是物件      普通的物件 /this/ 位元組碼檔案

 * 2. 要被所有的執行緒共享

 *

 * 注意 : 位元組碼檔案的使用範圍太大 , 一般不建議使用 .

 

空喚醒

 

##  Lock

 

使用步驟

 

1. 建立 ReentrantLock lock = new ReentrantLock(); 物件,需要注意的是多個執行緒必須使用同一個

 

2. 把之前的 synchronized( ){ lock.lock() 替換

 

3. }   lock.unlock(); 替換

 

好處

 

1. 不要考慮鎖物件

 

2. 程式碼看起來更加簡潔了

 

3. 可以使用 try..catch..finaly lock.unlock 放到 finaly 中,好處是如果該執行緒發生了異常,照樣可以釋放鎖

 

## 比較 synchronized Lock

 

 * 1.synchronized: jdk1.0 就開始使用的同步方法 - 稱為隱式同步

  * synchronized( 鎖物件 )

  * {// 獲取鎖      我們將鎖還可以稱為鎖旗艦或者監聽器

        同步的程式碼}// 釋放鎖

 

 * 2.Lock: jdk1.5 開始使用的同步方法 - 稱為顯示同步

 

 * 原理 :Lock 本身是介面 , 要透過他的子類建立物件幹活兒

 

 * 使用過程 :

 

 * 首先呼叫 lock() 方法獲取鎖

 

 * 進行同步的程式碼塊兒

 

 * 使用 unlock() 方法釋放鎖

 

 * 使用的場景 :

 

 * 當進行多生產者多消費者的功能時 , 使用 Lock, 其他的都使用 synchronized

 

 * 使用效率上 :Lock 高於 synchronized

 

## 多執行緒的單例

 

// 餓漢式 , 由於公共方法中只有一行公共的程式碼 , 所以不會產生執行緒安全問題

class SingleInstance1{

private static final SingleInstance1 s = new SingleInstance1();

private SingleInstance1() {

}

public static SingleInstance1 getInstance() {

return s;

}

}

 

 

// 懶漢式 ,

class SingleInstance2{

private static  SingleInstance2 s = null;

private SingleInstance2() {

}

public  static SingleInstance2 getInstance() {

if (s == null) {// 儘量減少執行緒安全程式碼的判斷次數 , 提高效率

 

synchronized (SingleInstance2.class) {// 使用同步程式碼塊兒實現了執行緒安全

if (s == null) {

s = new  SingleInstance2();

}

}

}

return s;

}

 

## 執行緒停止

 

1. 透過一個標識結束執行緒

 

2. 呼叫 stop 方法 --- 因為有固有的安全問題 , 所以系統不建議使用 .

 

3. 呼叫 interrupt 方法 ---- 如果目標執行緒等待很長時間(例如基於一個條件變數),則應使用 interrupt 方法來中斷該等待。

 


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

相關文章