LockSupport工具类

什么是LockSupport

LockSupport是JUC中的一个线程阻塞工具 ,主要提供线程的暂停(park) 和 唤醒(unpark)。

它具有以下几个特点:

  1. 许可证机制:每个线程都有一个许可证,初始值为0
  2. 非锁依赖:不强制要求先获取锁再使用
  3. 精准控制:能够精确唤醒指定的线程
  4. 不可重入:许可证不会叠加,最多只有一个

这些特点使得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被挂起,则它会被唤醒

相关推荐
_Evan_Yao1 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd1 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼2 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
王中阳Go2 小时前
两个入口答案不一致先别调模型:6 行入口口径对账表(附脚本)
人工智能·后端·python·大语言模型·1024程序员节
thefool1122662 小时前
TCP 1
java·1024程序员节
码事漫谈3 小时前
消除AI幻觉,普通人能做的五件事
后端
金銀銅鐵5 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手5 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
Mk598786 小时前
给 Agent 装上对话框 —— AgentScope-Java 接入 Spring Boot 与 SSE 流式实战
后端
付威20236 小时前
从 Loop 到 Runtime:rpi Agent Loop 与 Cordis 的边界、取舍与组合
后端