1. 程式人生 > 其它 >JAVA併發程式設計學習筆記09-LockSupport

JAVA併發程式設計學習筆記09-LockSupport

技術標籤:JAVA併發程式設計java多執行緒併發程式設計

JAVA併發程式設計學習筆記09-LockSupport

基本使用

關鍵方法

  • park():使當前執行緒暫停,類似wait()方法
  • unpark(Thread thread):喚醒指定執行緒,類似notify()方法

1.先呼叫park()再呼叫unpark()方法

@Slf4j
public class Test {

    public static void main
(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { log.info("park start"); LockSupport.park(); log.info("park end"); }); t1.start(); Thread.sleep(1000); log.info("unpark"
); LockSupport.unpark(t1); } }

在這裡插入圖片描述
返回結果可以看到,在呼叫了park方法後,執行緒t1處於暫停狀態,當主執行緒呼叫unpark方法喚醒t1後,t1甦醒。

2.先呼叫unpark()再呼叫park()方法

@Slf4j
public class Test {

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            try {
                Thread.
sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("park start"); LockSupport.park(); log.info("park end"); }); t1.start(); Thread.sleep(1000); log.info("unpark"); LockSupport.unpark(t1); } }

在這裡插入圖片描述
返回結果可以看出,先呼叫unpark後,t1執行緒呼叫park後並未進入休眠

原理

JAVA每個執行緒底層都有對應的Parker物件,其中有一個關鍵的屬性counter,當呼叫park()時,是判斷counter是否為1,若為1,則直接放行,然後將counter設為0,若為0,則休眠。呼叫unpark則是將counter設為1,故當先呼叫unpark方法再呼叫park不會進入休眠。

區別wait()和notify()

  1. wait()、notify()基於Monitor,需要synchnorized支援,而park()、unpark()基於Parker物件,不需要加鎖。
  2. wait()方法必須在notify()方法之前才能被喚醒,而park()方法可以先unpark().