Ch6-Java Lock 之 LockSupport

Ch6-Java Lock 之 LockSupport

January 9, 2020
Java | JUC
java

java.util.concurrent.locks.LockSupport

LockSupprot 是线程的阻塞原语,用来阻塞线程和唤醒线程。每个使用 LockSupport 的线程都会与一个许可关联,如果该许可可用,并且可在线程中使用,则调用 park() 将会立即返回,否则可能阻塞。如果许可尚不可用,则可以调用 unpark 使其可用。但是注意许可不可重入,也就是说只能调用一次 park() 方法,否则会一直阻塞。

public class LockSupport {
    public static void park(Object blocker); // 暂停当前线程
    public static void parkNanos(Object blocker, long nanos); // 暂停当前线程,不过有超时时间的限制
    public static void parkUntil(Object blocker, long deadline); // 暂停当前线程,直到某个时间
    public static void park(); // 无期限暂停当前线程
    public static void parkNanos(long nanos); // 暂停当前线程,不过有超时时间的限制
    public static void parkUntil(long deadline); // 暂停当前线程,直到某个时间
    public static void unpark(Thread thread); // 恢复当前线程
    public static Object getBlocker(Thread t);
}

Object.wait() 和 LockSupport.park() 的区别

  • Object.wait() 方法需要在 synchronized 块中执行;LockSupport.park() 可以在任意地方执行;
  • Object.wait() 方法声明抛出了中断异常,调用者需要捕获或者再抛出;LockSupport.park() 不需要捕获中断异常;
  • Object.wait() 不带超时的,需要另一个线程执行 notify() 来唤醒,但不一定继续执行后续内容;LockSupport.park() 不带超时的,需要另一个线程执行 unpark() 来唤醒,一定会继续执行后续内容;