JAVA併發程式設計學習筆記09-LockSupport
阿新 • • 發佈:2020-12-22
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()
- wait()、notify()基於Monitor,需要synchnorized支援,而park()、unpark()基於Parker物件,不需要加鎖。
- wait()方法必須在notify()方法之前才能被喚醒,而park()方法可以先unpark().