鎖支持工具 LockSupport
1. 前言
本節帶領大家認識第三個常用的 Java 并發鎖工具之 LockSupport。
本節先介紹 LockSupport 工具類的用途,然后介紹關鍵的編程方法,最后通過一個編程例子為大家展示 StampedLock 工具類的用法。
下面我們正式開始介紹吧。
2. 概念解釋
LockSupport 是一個線程工具類,提供的方法均是靜態方法,可使用類型直接調用。其定義的一組以 park 開頭的方法用于阻塞當前線程,定義的 unpark 方法用于喚醒被阻塞的線程。
LockSupport 提供的這種功能,應用在哪些場合比較合適呢?下面我們給出最常用的場景說明。
3. 常用場景
LockSupport 可以在任何場合使用它阻塞線程,也可以對指定的任何線程進行喚醒,而不用擔心阻塞和喚醒操作的順序。
JDK 并發包下的鎖和其他同步工具在底層實現中大量使用了 LockSupport 工具類 進行線程的阻塞和喚醒,了解其用法和原理,可以更好地理解鎖和其它同步工具的底層實現。
下面我們通過一個編程例子體會一下 LockSupport 工具類的用法。
4. 編程案例
import java.util.concurrent.locks.LockSupport;
public class LockSupportTest {
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "即將被中斷");
LockSupport.park();
System.out.println(Thread.currentThread().getName() + "已經被中斷");
}
});
t1.setName("實驗線程");
// 線程啟動立刻執行,在線程內調用了 park 做了線程中斷
t1.start();
Thread.sleep(5000L);
// 5 秒后喚醒中斷的線程 t1
LockSupport.unpark(t1);
System.out.println(t1.getName() + "被恢復中斷了");
Thread.sleep(100000L);
}
}
運行結果如下:
實驗線程準備被中斷
實驗線程已經被中斷了
實驗線程被恢復中斷了
用法是不是很簡單呢?但其中的原理可沒有那么簡單,需要我們繼續深入學習。
5. 小結
本節解釋了 LockSupport 的基本概念和常用場景,且通過一個簡單的例子展示了其用法,更多關于此工具類的概念和原理介紹,可閱讀 “Java 并發原理入門教程” 。
至此,Java 并發工具課程全部結束了。本課程從 Java 并發包的結構開始講起,然后對內容分類講解,在講解每一個知識點時,都解釋了基本概念原理,列舉了應用場景,并配示例代碼輔助大家理解。希望大家在學習過程中,多思考勤練習,早日掌握之。