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

1、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方法,其會馬上返回。

2、源碼:

相關文章
相關標籤/搜索