1. 程式人生 > >15-執行緒等待通知機制總結

15-執行緒等待通知機制總結

  1. 執行緒等待通知機制總結
    1. 概述

一個執行緒的等待阻塞狀態,受另外一個執行緒控制。

 

Object.wait()

Object.notify()

特點

必須基於特定的物件鎖synchronized

Notify只會對已經處於wait狀態的執行緒生效。

使用

必須在synchronized(obj)程式碼內部使用,否則會丟擲異常

原理

執行緒等待/喚醒在特定的物件鎖obj上

執行緒中斷

Wait()中的執行緒,被其他執行緒t.interrupt()後,可中斷阻塞狀態,繼續執行程式碼,並丟擲interruptedException異常。

LockSupport.park()

LockSupport.unpark(t)

特點

不需要維護同一物件,可實現模組之間的解耦

Unpark可對已經處於park(),或者下次處於park()狀態的執行緒生效

原理

內部呼叫的是unsafe.park/unpark()方法實現的

執行緒中斷

Park()中的執行緒,被其他執行緒t.interrupt()後,可中斷阻塞狀態,繼續執行程式碼,不丟擲interruptedException異常。

 

 

 

    1. Object.wait()/notify()
      1. 使用案例

      1. 執行結果

      1. 特點

多個執行緒用於維護同一個物件鎖。

Wait notify等需要在synchronized物件鎖內部呼叫,否則會丟擲IllegalMonitorStateException。

      1. 使用場景

生產消費者模型

 

    1. LockSupport.park()/unpark()
      1. 使用案例

      1. 執行結果

      1. 特點

兩個執行緒之間不需要維護同一個物件,可以實現模組之間的解耦。

Unpark可以在park之前呼叫,可以對之後的執行緒t的一次park進行喚醒。

      1. 使用場景

基於CAS原理,用於實現鎖的內部機制。

 

    1. lock.lock()/unlock()  condition.await()/asignal()
      1. 使用案例

      1. 執行結果

1 2 A 3 4 B 5 6 C

      1. 特點

多個執行緒之間需要維護同一個可重入的互斥鎖ReentrantLock,同時基於該鎖建立多個條件佇列(和執行緒種類數相同),線上程A執行到特定條件下阻塞await()當前執行緒的條件佇列並喚醒asignal()特定執行緒的條件佇列。

      1. 使用場景

允許執行緒在一定時間內獲取鎖,獲取失敗則返回(而非陷入休眠);

允許讀寫鎖分離的場景;

允許以任何順序獲取和釋放多個鎖。

多執行緒學習大綱:https://mp.csdn.net/postedit/84768644