本文为何适原创并发编程系列第 13 篇,文末有本系列文章汇总。
java.util.concurrent 中源码频繁使用的 LockSupport 来阻塞线程和唤醒线程,如 AQS 的底层实现用到 LockSupport.park()方法和 LockSupport.unpark()方法。
LockSupport 到底是什么?同样是阻塞和唤醒线程为什么不用 Object 的 wait()/notify 方法?
LockSupport 提供 park()和 unpark()方法实现阻塞线程和解除线程阻塞。
阻塞线程:
每个 park 方法都对应有一个带有 Object 阻塞对象的重载方法。增加了一个 Object 对象作为参数,此对象在线程受阻塞时被记录,以允许监视工具和诊断工具确定线程受阻塞的原因。
唤醒线程:
void unpark(Thread thread):唤醒处于阻塞状态的指定线程
使用举例
public class LockSupportDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
LockSupport.park();
System.out.println("thread线程被唤醒");
});
thread.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(thread);
}
}
thread线程park阻塞。
主线程sleep3s之后,unpark(thread)。
thread被唤醒,输出"thread线程被唤醒"。
每个线程都会与一个许可关联,这个许可对应一个 Parker 的实例,Parker 有一个 int 类型的属性_count。
park()方法:
unpark()方法: