LockSupport使用

LockSupport从入门到深入理解 LockSupport Condition ,wait,notify 阅读详情

LockSupport功能

  1. LockSupport在JDK中主要提供了线程的阻塞和唤醒功能。提供了更高级别的同步功能。
  2. 阻塞方法主要是以park开头的各种方法,唤醒线程的方法只有unpark一个方法。
  3. LockSupport中的 park和unpark方法提供的线程阻塞和唤醒功能,避免了Object中已经废弃方法suspend和resume引起的死锁问题。

阻塞方法

  1. park方法的执行与获得的执行许可有关系。如果获得许可,则调用park方法立即返回;如果没有获得许可,则调用park方法一直阻塞。默认情况下,调用park方法是没有获得许可的,即调用该方法要阻塞。
  2. park方法阻塞时,发生如下情况下可以就可解除阻塞
    2.1 其他线程调用该线程的unpark方法
    2.2 其他线程调用该线程的interrput方法,即park方法能够响应中断。
  3. LockSupport类中的park方法
// 阻塞当前线程
 public static void park()
// 在规定的纳秒时间内阻塞状态
 public static void parkNanos(long nanos) 
 // 在规定的毫秒时间内阻塞
 public static void parkUntil(long deadline)
 // 在规定的时间内阻塞与当前线程相关联的对象
 public static void parkUntil(Object blocker, long deadline)
 // 阻塞与当前线程相关联的对象
 public static void park(Object blocker) 

park

  1. 默认情况下,park方法获取不到执行许可,执行该方法会一直阻塞
public class LockSupportService {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //LockSupport.unpark(Thread.currentThread());
        // 默认是被占用的,会一直阻塞下去
        LockSupport.park();;
        System.out.println("aaaa");
    }
}

1.1. 如果上述程序中先调用LockSupport中的unpark方法,则park方法获取到了许可,则不会阻塞。会立即返回。程序打印出aaaa。

unpark

  1. unpark(Thread thread)方法为唤醒当前执行阻塞的线程。其方法参数就是指需要唤醒的线程对象。
  2. 结合park方法,了解一下LockSupport工具的使用。
public class LockSupportService {

    public static void main(String[] args) {
        // 释放许可 
        LockSupport.unpark(Thread.currentThread());
        // 默认是被占用的
        LockSupport.park();;
        System.out.println("aaaa");
        Thread ta = new Thread(new ServiceA());
        Thread tb = new Thread(new ServiceB(ta));    
        ta.start();
        tb.start();
    }

}
// 线程A
class ServiceA implements Runnable{
    public void run() { 
        LockSupport.park();
         System.out.println("I am  service A ");
    }
}
// 线程B
class ServiceB implements Runnable{
    private Thread thread;
    public ServiceB(Thread thread) {
        super();
        this.thread = thread;
    }

    public void run() {
        try {
            Thread.sleep(20*1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         //thread.interrupt();
         // 唤醒当前阻塞的线程
         LockSupport.unpark(thread);;
         System.out.println("I am  service B "); 
    }
}
  1. 上述程序线程A调用park方法,默认情况下是没有获得许可,一直处于阻塞状态。线程B睡眠20秒后,唤醒线程A。最终程序执行结果如下图所示:
    这里写图片描述
  2. 将线程B中的LockSupport中的unpark方法换成Thread.interrupt方法后,执行效果一样,则证明了LockSupport中的park方法能够响应线程的中断。interrupt中断当前线程的执行状态。
    这里写图片描述

总结

  1. LockSupport工具类在JDK中的并发处理中底层使用挺多的,多用心去理解和多看源码有助于更深刻的了解。
GD-Link离线烧录全攻略:从配置到一键下载的保姆级教程 本文详细介绍了GD-Link离线烧录的全流程,从硬件准备到软件配置,再到一键下载的实战技巧。通过保姆级教程,帮助工程师快速掌握国产MCU的离线烧录技术,适用于产线批量烧录和现场设备维护等场景,显著提升工作效率。 阅读详情

相关推荐

XGBoost算法案例 - 红酒品质分类

数据集共包含 11 个特征,共计 3269 条数据. 我们通过训练模型来预测红酒的品质, 品质共有 6 个各类别,分别使用数字: 0、1、2、3、4、5 来表示。

YIAN爱学习的博客 449

LockSupport

LockSupport LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 LockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程。 3种让线程等待和唤醒的方法 使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程 使用JUC包中Condition的await()方法让线程等待,使用signal()方法唤醒线程 LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程 1. 使用Object中的w

weixin_42480780的博客 5930

【自动驾驶学习笔记——Prescan和Simulink 学习笔记和问题记录(1)】

主要记录一些Prescan/Simulink 联合仿真出现的问题。

ly1336545868的博客 1465

LockSupport详解

前言 LockSupport是concurrent包中一个工具类,不支持构造,提供了一堆static方法,比如park(),unpark()等。 LockSupport中的主要成员及其加载时的初始化: 不难发现,他们在初始化的时候都是通过Unsafe去获得他们的内存地址,这里也可以理解为C中的指针。 Unsafe Unsafe类可以参考我之前写的文章:深入理解sun.misc.Unsafe原理 ...

Deegue 1万+

从零到一:RK3588嵌入式开发中的SDK与MPP集成实战解析

本文详细解析了RK3588嵌入式开发中SDK与MPP(Media Process Platform)的集成实战,涵盖开发环境构建、SDK架构解析、MPP集成关键技术点及常见问题诊断。通过Qt5.12.10交叉编译环境配置和硬件加速优化,帮助开发者高效完成嵌入式视觉项目开发,特别适合边缘计算应用场景。

weixin_29189381的博客 510

RouterOS v7.6实战:5分钟搞定IPv6双栈配置(含光猫桥接避坑指南)

本文详细解析了在RouterOS v7.6系统中配置IPv6双栈网络的实战步骤,特别针对家庭网络光猫桥接模式下的常见问题提供了避坑指南。文章涵盖了从基础配置到企业级部署的进阶内容,包括IPv6前缀获取、DHCPv6客户端设置、路由通告以及安全优化,帮助用户充分利用v7.6版本在IPv6支持上的改进与优势。

embedding5hiker的博客 1280

LockSupport是做什么的?深入理解Java的三种线程等待通知机制

在java.util.concurrent.locks包下,有一个不经常被人关注的类:LockSupport。用于创建锁和其他同步类的基本线程阻塞元语。总共有如下几个方法:LockSupport类使用了一种名为Permit(许可)的概念来做到阻塞和唤醒线程的功能,每个线程都有一个许可(Permit),但是与Semaphore不同的是,许可的累加上限是1。大概的意思就是:LockSupport中的park()和unpark()的作用分别是阻塞线程和解除阻塞线程。

秃了也弱了 1302

Mathcad在LLC谐振变换器设计中的公式推导实战

本文通过Mathcad软件,详细演示了LLC谐振变换器设计的核心公式推导实战。文章阐述了如何利用Mathcad作为“会思考的草稿纸”,从定义基本参数、应用基波近似法(FHA)模型,到逐步推导电压增益公式及确定工作边界频率(fmin, fmax),并展示了如何通过动态参数扫描进行优化设计,帮助电源工程师高效、直观地完成理论计算,为后续仿真与实现奠定坚实基础。

q1w3e5r7t9y的博客 295

Java并发 - LockSupport详解

`LockSupport`是Java中用于实现线程阻塞和唤醒的工具类。它提供了一种基于线程的阻塞原语,能够在不需要持有锁的情况下实现线程的挂起和唤醒操作。

--土拨鼠-- 1921

【gridsample】地平线征程6芯片中gridsample算子的优化与部署实践

本文详细介绍了地平线征程6芯片中gridsample算子的优化与部署实践,重点探讨了PTQ和QAT量化方案在BEV感知任务中的应用。通过双线性插值优化、内存布局调整和混合精度配置等关键技术,显著提升了算子在自动驾驶场景下的性能和精度,为开发者提供了实用的部署指南和调优建议。

zero1的博客 1019

广东省道路工程检测练习试题(单选题)真题

1.一般项目的合格点率应达到( ),且不合格点的最大偏差值不得大于规定允许偏差值的1.5倍。A.不低于75%B.不低于80%C.不低于85%D.不低于90%答案:B2.进行土路基平整度检测时,当路宽小于9m,检测点数应为( )A.1B.2C.3D.4答案:A3.根据《城镇道路工程施工与质量验收规范》,在分部工程中,根据工种、材料、施工工艺等划分的是( )A.单位工程B.分项工程C.分部工程D.工序工程答案:B4.根据《城镇道路工程施工与质量验收规范》,土方路基压实度的检测频率为每1000m每压实层抽检( )

ZShy001238的博客 684

LockSupport 是什么?怎么用?

前言 本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定Java并发 正文 LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。 与 Thread.suspend() 方法相比,它弥补了由于 resume() 方法发生导致线程无法继续执行的情况。 关于 suspend 和 resume 请参考我的博客——线程的挂起(suspend)和继续执行(r

Shockang的博客 7180

YOLOv11改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数

是一种基于IoU的损失函数,旨在解决目标检测中边界框回归损失函数在处理低质量训练数据时的问题。论文链接:https://arxiv.org/pdf/2301.10051 源码链接:https://github.com/Instinct323/wiou此处需要查看的文件是中定义了模型的损失函数和计算方法,我们想要加入新的损失函数就只需要将代码放到这个文件内即可将下方的函数替换原本的函数即可: 用于计算各种损失。在内修改如下代码,使模型调用此损失函数。 tal.py中是一些损失函数的功能应用。在内修改如下代码,

Limiiiing的博客 3795

LockSupport使用及源码详解

LockSupport使用及源码详解 在讲了一批并发工具后,突然想起LockSupport类了,这个工具类我也很少用,所以这次写了个小demo后,决定也写一篇文章记录一下,以下就是记录过程。 LockSupport用法 在网上随便找了个演示demo,如下: public class LockSupportDemo { public static void main(String[] a...

u012734441的专栏 2587

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LockSupport使用例子

LockSupport普通例子: public class LockSupportPark { public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Runnable() { public void run()...

jingzhi_f 256

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LockSupport解析与使用

LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞,实现的阻塞和解除阻塞是基于”许可(permit)”作为关联,permit相当于一个信号量(0,1),默认是0. 线程之间不再需要一个Object或者其它变量来存储状态,不再需要关心对方的状态.

朔方飞絮谈安全 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JUC锁之LockSupport

LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。 它的内部其实两类主要的方法:park(停车阻塞线程)和unpark(启动唤醒线程)。

liuerchong的博客 1789

LockSupport详解以及使用

LockSupport是Java并发编程中用于线程阻塞和唤醒的基础工具类,位于java.util.concurrent.locks包。它提供比传统wait()/notify()更灵活、可靠的线程控制机制,基于**许可(Permit)**实现:unpark()发放许可,park()消耗许可(无许可则阻塞)。支持先unpark后park不阻塞、指定线程唤醒,且无需同步锁。常用于JUC组件(如AQS)底层,提供park()/unpark()核心方法及带阻塞原因、超时的变体

BUG糕手的博客 808

LockSupport 使用

使用: package com.xinyu.test; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; public class LockSupportTest { public static void main(String[] args) { Thread thread = Thread.currentThread(); new Threa

男儿不展风云志,空有天生八尺躯 495

Java中LockSupport的使用

一、基本使用 LockSupport是JDK1.6中在java.util.concurrent中的子包locks中引入的一个比较底层的工具类,用来创建锁和其他同步工具类的基本线程阻塞原语。java锁和同步器框架的核心 AQS: AbstractQueuedSynchronizer,就是通过调用 LockSupport .park()和 LockSupport .unpark()实现线程的阻塞和唤...

black_bird_cn的博客 2193

java locksupport_Java-LockSupport

LockSupport 和 CAS 是 Java 并发包中很多并发工具控制机制的基础,它们底层其实都是依赖 Unsafe 实现。LockSupport 提供 park() 和 unpark() 方法实现阻塞线程和解除线程阻塞。每个使用 LockSupport 的线程都会与一个许可(permit)关联,如果该许可可用,则调用 park() 将会立即返回。如果许可尚不可用,则可以调用 unpark()...

weixin_35650041的博客 170

LockSupport 深入源码解析

  LockSupport是一个线程工具类,所有的方法都是静态方法,可以在线程任意位置阻塞、唤醒线程。LockSupport的功能是依赖Unsafe类实现的。   演示示例: package com.securitit.serialize.locks; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.LockSupport; public class LockSupportTester { public

键盘上流淌的日子 7820
上一篇: ConcurrentLinkedQueue学习
下一篇: CAP和BASE理论理解
鸡蛋达芬奇
博客等级 码龄19年 24粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值