鎖支持工具 LockSupport
1. 前言
本節(jié)帶領(lǐng)大家認(rèn)識(shí)第三個(gè)常用的 Java 并發(fā)鎖工具之 LockSupport。
本節(jié)先介紹 LockSupport 工具類的用途,然后介紹關(guān)鍵的編程方法,最后通過一個(gè)編程例子為大家展示 StampedLock 工具類的用法。
下面我們正式開始介紹吧。
2. 概念解釋
LockSupport 是一個(gè)線程工具類,提供的方法均是靜態(tài)方法,可使用類型直接調(diào)用。其定義的一組以 park 開頭的方法用于阻塞當(dāng)前線程,定義的 unpark 方法用于喚醒被阻塞的線程。
LockSupport 提供的這種功能,應(yīng)用在哪些場(chǎng)合比較合適呢?下面我們給出最常用的場(chǎng)景說明。
3. 常用場(chǎng)景
LockSupport 可以在任何場(chǎng)合使用它阻塞線程,也可以對(duì)指定的任何線程進(jìn)行喚醒,而不用擔(dān)心阻塞和喚醒操作的順序。
JDK 并發(fā)包下的鎖和其他同步工具在底層實(shí)現(xiàn)中大量使用了 LockSupport 工具類 進(jìn)行線程的阻塞和喚醒,了解其用法和原理,可以更好地理解鎖和其它同步工具的底層實(shí)現(xiàn)。
下面我們通過一個(gè)編程例子體會(huì)一下 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() + "已經(jīng)被中斷");
}
});
t1.setName("實(shí)驗(yàn)線程");
// 線程啟動(dòng)立刻執(zhí)行,在線程內(nèi)調(diào)用了 park 做了線程中斷
t1.start();
Thread.sleep(5000L);
// 5 秒后喚醒中斷的線程 t1
LockSupport.unpark(t1);
System.out.println(t1.getName() + "被恢復(fù)中斷了");
Thread.sleep(100000L);
}
}
運(yùn)行結(jié)果如下:
實(shí)驗(yàn)線程準(zhǔn)備被中斷
實(shí)驗(yàn)線程已經(jīng)被中斷了
實(shí)驗(yàn)線程被恢復(fù)中斷了
用法是不是很簡(jiǎn)單呢?但其中的原理可沒有那么簡(jiǎn)單,需要我們繼續(xù)深入學(xué)習(xí)。
5. 小結(jié)
本節(jié)解釋了 LockSupport 的基本概念和常用場(chǎng)景,且通過一個(gè)簡(jiǎn)單的例子展示了其用法,更多關(guān)于此工具類的概念和原理介紹,可閱讀 “Java 并發(fā)原理入門教程” 。
至此,Java 并發(fā)工具課程全部結(jié)束了。本課程從 Java 并發(fā)包的結(jié)構(gòu)開始講起,然后對(duì)內(nèi)容分類講解,在講解每一個(gè)知識(shí)點(diǎn)時(shí),都解釋了基本概念原理,列舉了應(yīng)用場(chǎng)景,并配示例代碼輔助大家理解。希望大家在學(xué)習(xí)過程中,多思考勤練習(xí),早日掌握之。