LockSupport
类是jdk1.6引入的一个工具类,所有的方法都是静态方法。他主要提供了可以使线程阻塞和唤醒的方法,它是JUC中锁和其他并发类实现的基础。LockSupport
核心方法都是基于Unsafe
类中的Park
方法和unpark
方法实现的。
1 void park()
类似方法:void parkUntil(long deadline)
、void parkNanos(long nanos)
阻塞当前线程
2 void park(Object blocker)
线程调用该方法会立即被阻塞挂起,并设置当前线程的parkBlocker字段为blocker对象,这个blocker对象会被记录到阻塞的线程内部。
使用Java诊断工具jstack可以观察线程被阻塞的原因,jstack是通过调用getBlocker(Thread)方法来获取线程的Blocker对象的,所以JDK推荐使用带有Blocker参数的park方法,这样当内存dump排查问题的时候就能知道哪个类被阻塞了。
public static void park(Object blocker) {
// 获取当前线程
Thread t = Thread.currentThread();
// 设置当前线程的blocker
setBlocker(t, blocker);
// 阻塞当前线程
UNSAFE.park(false, 0L);
// 线程被唤醒后,需要设置bloker为null,避免下次调用其他park方法时,
// blocker字段任为此次设置的blocker
setBlocker(t, null);
}
3 void unpark(Thread thread)
唤醒线程
注:本文为《Java修炼指南:高频源码解析》阅读笔记