一、LockSupport工具類
1.該類的主要作用
- 掛起和喚醒線程,該工具類是創建鎖和其他同步類的基礎。
- LockSupport類與每個使用它的線程都會關聯一個許可證,默認情況下調用LockSupport類的方法的線程是不持有許可證的。LockSupport使用Unsafe類進行實現的。
2.void park()方法
- 如果調用park方法的線程已經拿到了與LockSupport關聯的許可證,則調用LockSupport.park()時會馬上返回,否則調用線程會禁止參與線程的調度,也就是會被阻塞掛起
- 下面的代碼只會輸出"begin park!,然後當前線程被掛起,這是因爲在默認情況下調用線程是不持有許可證的
package com.ruigege.LockSourceAnalysis6;
import java.util.concurrent.locks.LockSupport;
public class Test1 {
public static void main(String[] args) {
System.out.println("begin park!");
LockSupport.park();
System.out.println("end park");
}
}
- 其他線程調用unpark(Thread thread)方法並且將當前線程作爲參數時,調用park方法而被阻塞的線程就會被返回。另外,如果其他線程調用了阻塞線程的interrupt()方法時,設置了中斷標誌或者線程被虛假喚醒,則阻塞線程也會返回,所以在調用park方法時最好也是用循環條件的判斷方式。需要注意的是,因爲調用park方法而被阻塞的線程被其他線程中斷而返回時並不會拋出InteruptedException異常
3.void unpark(Thread thread)方法
package com.ruigege.LockSourceAnalysis6;
import java.util.concurrent.locks.LockSupport;
public class Test2 {
public static void main(String[] args) {
System.out.println("李天陽");
LockSupport.unpark(Thread.currentThread());
LockSupport.park();
System.out.println("end park");
}
}
- 當一個線程調用unpark時,如果參數thread線程沒有持有thread與LockSupport類關聯的許可證,則讓thread線程持有,如果thread之前因爲調用park()而被掛起,則調用upark之後,該線程會被喚醒。如果thread之前沒有調用park,則調用unpark方法後,再調用park方法,其會立刻返回。
二、源碼:
- 所在包:com.ruigege.ConcurrentListSouceCodeAnalysis5
https://github.com/ruigege66/ConcurrentJava
- 歡迎關注微信公衆號:傅里葉變換,個人賬號,僅用於技術交流