LockSupport工具类

什么是LockSupport

LockSupportJUC中的一个线程阻塞工具 ,主要提供线程的暂停(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方法。

与线程调用waitsleep方法不同的是,通过park方法阻塞时,被其他线程中断之后不会抛出 InterruptedException移除。

unpark方法

java 复制代码
public static void unpark(Thread thread) {
    if (thread != null)
        U.unpark(thread);
}

当一个线程调用unpark时,如果传入的线程没有持有许可证,则会让传入的线程持有许可证。 如果传入的线程之前因为调用park被挂起,则它会被唤醒

相关推荐
小gaigagi几秒前
旺店通·旗舰奇门数据集成到金蝶云星空的技术实现案例
后端
用户607320369458 分钟前
Python 入门必备-pip install 常用命令例子大全:从基础安装到国内镜像加速实战
后端
极客先躯8 分钟前
高级java每日一道面试题-2025年12月09日-实战篇[Docker]-如何配置 Docker 的日志驱动?有哪些日志驱动可选?
java·docker·日志驱动的作用与配置层级·日志驱动全览与对比·日志驱动配置的要点·日志标签定制·容器与宿主机时间戳
小小小前端啊12 分钟前
前端网络知识指南
后端
rabbit_pro32 分钟前
Spring AI使用Ollama
java·人工智能·spring
Mike117.32 分钟前
GBase 8a 物化视图依赖和 DDL 风险排查记录
java·服务器·前端
李少兄41 分钟前
领域驱动设计与 Clean Code 的实践
java·数据库·领域驱动
野犬寒鸦1 小时前
Claude Code:终端AI编程助手全指南(附带指令全讲解)
开发语言·后端·面试·ai编程
老马95271 小时前
opencode7-桌面应用实战2
java·人工智能·后端