15-執行緒等待通知機制總結
- 執行緒等待通知機制總結
- 概述
一個執行緒的等待阻塞狀態,受另外一個執行緒控制。
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異常。 |
-
- Object.wait()/notify()
- 使用案例
- Object.wait()/notify()
-
-
- 執行結果
-
-
-
- 特點
-
多個執行緒用於維護同一個物件鎖。
Wait notify等需要在synchronized物件鎖內部呼叫,否則會丟擲IllegalMonitorStateException。
-
-
- 使用場景
-
生產消費者模型
-
- LockSupport.park()/unpark()
- 使用案例
- LockSupport.park()/unpark()
-
-
- 執行結果
-
-
-
- 特點
-
兩個執行緒之間不需要維護同一個物件,可以實現模組之間的解耦。
Unpark可以在park之前呼叫,可以對之後的執行緒t的一次park進行喚醒。
-
-
- 使用場景
-
基於CAS原理,用於實現鎖的內部機制。
-
- lock.lock()/unlock() condition.await()/asignal()
- 使用案例
- lock.lock()/unlock() condition.await()/asignal()
-
-
- 執行結果
-
1 2 A 3 4 B 5 6 C
-
-
- 特點
-
多個執行緒之間需要維護同一個可重入的互斥鎖ReentrantLock,同時基於該鎖建立多個條件佇列(和執行緒種類數相同),線上程A執行到特定條件下阻塞await()當前執行緒的條件佇列並喚醒asignal()特定執行緒的條件佇列。
-
-
- 使用場景
-
允許執行緒在一定時間內獲取鎖,獲取失敗則返回(而非陷入休眠);
允許讀寫鎖分離的場景;
允許以任何順序獲取和釋放多個鎖。