Java高併發19-併發包中鎖原理解析(一)

一、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");
 }

}
19.1
19.1
  • 其他線程調用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());
  // 再次調用park方法
  LockSupport.park();
  System.out.println("end park");
 }
}

19.2
19.2
  • 當一個線程調用unpark時,如果參數thread線程沒有持有thread與LockSupport類關聯的許可證,則讓thread線程持有,如果thread之前因爲調用park()而被掛起,則調用upark之後,該線程會被喚醒。如果thread之前沒有調用park,則調用unpark方法後,再調用park方法,其會立刻返回。

二、源碼:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章