什么是LockSupport
LockSupport是JUC中的一个线程阻塞工具 ,主要提供线程的暂停(park) 和 唤醒(unpark)。
它具有以下几个特点:
- 许可证机制:每个线程都有一个许可证,初始值为0
- 非锁依赖:不强制要求先获取锁再使用
- 精准控制:能够精确唤醒指定的线程
- 不可重入:许可证不会叠加,最多只有一个
这些特点使得LockSupport相对于传统的wait/notify更具有优势:
| 对比项 | Object.wait()/notify() | LockSupport.park()/unpark() |
|---|---|---|
| 锁要求 | 必须在synchronized块内 | 不需要获取锁 |
| 顺序性 | 必须先wait后notify | 可以先unpark后park |
| 精确性 | 随机唤醒一个或全部线程 | 可指定唤醒具体线程 |
| 灵活性 | 较低 | 较高 |
LockSupport的实现
LockSupport是使用Unsafe类实现的,下面来看LockSupport的方法
park方法
java
public static void park(Object blocker) {
Thread t = Thread.currentThread();
setBlocker(t, blocker);
U.park(false, 0L);
setBlocker(t, null);
}
如果调用park方法的线程已经拿到了许可证,那么调用之后会马上返回,否则会被阻塞挂起。
在线程被阻塞直到被调用unpark方法或者其他线程调用了它的interrupt方法。
与线程调用wait和sleep方法不同的是,通过park方法阻塞时,被其他线程中断之后不会抛出 InterruptedException移除。
unpark方法
java
public static void unpark(Thread thread) {
if (thread != null)
U.unpark(thread);
}
当一个线程调用unpark时,如果传入的线程没有持有许可证,则会让传入的线程持有许可证。 如果传入的线程之前因为调用park被挂起,则它会被唤醒