java并发编程的艺术(7)LockSupport

Java并发编程专题之LockSupport LockSupport 后续我会发布一系列和并发编程相关的博客,不会太深,也不会太浅,既触碰到源码原理,又不会迷失于细节之中。主要选取的也是面试高频考点,但是我不想只停留在API表面,或者仅仅是收集一些面试题来背,而是会尽力搞清楚他们的原理,让大家能知其然,知其所以然,牢牢记住,构建自己的知识体系。 能力有限,如有错误,希望能批评指正 希望博客能伴我成长,也欢迎小伙伴加我微信:15316162191,大家一起备战秋招 点个关注不迷路~ 概述 LockSupport是一个编程工具类,主要是为了阻塞和唤醒线 阅读详情

关于LockSupport工具类的使用

在阅读aqs源码的时候,经常会看到使用了LockSupport工具类,这个工具类里面提供了两个用于堵塞现线程和解除线程堵塞的接口:
park
unpark

核心源码:

private static void setBlocker(Thread t, Object arg) {
    // Even though volatile, hotspot doesn't need a write barrier here.
    UNSAFE.putObject(t, parkBlockerOffset, arg);
}

/**
 * Makes available the permit for the given thread, if it
 * was not already available.  If the thread was blocked on
 * {@code park} then it will unblock.  Otherwise, its next call
 * to {@code park} is guaranteed not to block. This operation
 * is not guaranteed to have any effect at all if the given
 * thread has not been started.
 *
 * @param thread the thread to unpark, or {@code null}, in which case
 *        this operation has no effect
 */
public static void unpark(Thread thread) {
    if (thread != null)
        UNSAFE.unpark(thread);
}


public static void park(Object blocker) {
    Thread t = Thread.currentThread();
    setBlocker(t, blocker);
    UNSAFE.park(false, 0L);
    setBlocker(t, null);
}

从源码中的构造函数可以看到:
该类是不能够被实例化的。

提供的方法大多数都是静态方法

提供了一些静态成员变量:

// Hotspot implementation via intrinsics API
private static final sun.misc.Unsafe UNSAFE;
private static final long parkBlockerOffset;
private static final long SEED;
private static final long PROBE;
private static final long SECONDARY;

UNSAFE: 工具类
这是一种jdk内部提供的工具类,可以直接操控内存,被jdk广泛用于自己的jar包里面,提供一些对于java来说不安全的功能供java代码调用。让jdk能实现 更多的一些需要用native语言,C或者C++才能实现的功能。

看过Thread源码的朋友应该知道thread里面有一个
volatile Object parkBlocker;
成员变量,这个成员变量主要是提供给LockSupport所使用的。

通过demo测试发现:
LockSupport阻塞和解除阻塞线程直接操作的是Thread,
而Object的wait/notify它并不是直接对线程操作,它是被动的方法,它需要一个object来进行线程的挂起或唤醒。也就是说Thread在进行唤醒操作之后,还需要获取到监视器才可以继续执行。
而LockSupport则不需要。

如果我们将unpark和park的顺序进行调换,结果又会如何呢?
经过测试,不会有影响。反而更加具有灵活性。

线程的中断性测试:
第一种,通过使用interrupt()的方式来进行线程中断:
结果并没有实际的效果,因为interrupt()只不过是将线程的中断状态进行设置调整罢了。并没有进行完整的中断。因此需要加入一个开关来进行中断处理:

/**
 * @author idea
 * @data 2019/2/1
 */
public class Demo2 implements Runnable{

    public static void main(String[] args) throws InterruptedException {
        Thread testThread=new Thread(new Demo2(),"InterruptionInJava");
        testThread.start();
        Thread.sleep(1000);
        //对该线程进行中断测试
        testThread.interrupt();
        System.out.println("end");
    }

    @Override
    public void run() {
        while(true){
            if(!Thread.currentThread().isInterrupted()){
                System.out.println("this is a test!");
            }else{
                break;
            }
        }
    }
}

如果遇到了类似于下图中的这种情况:线程堵塞
在这里插入图片描述
interrupt函数可以提供将该线程进行中断的处理,不过可能会有相应的异常抛出。

parkBlockerOffset是unsafe包里面的一个成员变量。由于目标线程可能是处于堵塞状态,因此想要获取相应的对象,需要通过一个parkBlockerOffset的内存偏移量来获取对象信息。
LockSupport中的park方法可以设定相应的堵塞时间长度,防止一直堵塞。

并发编程系列之掌握LockSupport的用法 并发编程系列之掌握LockSupport的用法,LockSupport是用于创建锁和其他同步类的基本线程阻塞原语,LockSupport提供了两类最基本的API 阅读详情

相关推荐

Ubuntu离线情况下安装gcc编译器

Ubuntu离线情况下安装gcc编译器1.系统版本2.安装说明3.异常处理 1.系统版本 (1)Ubuntu系统版本:20.04.1LTS; (2)gcc编译器版本:gcc-9.3.0(下载链接为https://download.youkuaiyun.com/download/qq_18350351/13762214); 当前可找到的gcc最新版本为gcc-10,但是笔者在安装gcc-10版本时发现一些依赖项无法安装,因此选取了gcc-9版本。如果是在联网情况下安装,直接使用apt相关的安装指令即可。 2.安装说明 安

GreenHand的博客 3933

java.util.concurrent.locks.LockSupport

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34001430的博客 384

光纤接口类型与应用场景全解析

本文全面解析了光纤接口的类型与应用场景,详细介绍了SC、LC、FC和ST等主流光纤接口的特点及适用环境。从数据中心的高密度布线到工业环境的极端条件,提供了专业的接口选型指南和实战经验,帮助读者根据具体需求选择最合适的光纤接口方案。

weixin_29289821的博客 411

LockSupport工具

1. LockSupport简介 在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步组件的实现中被频繁使用的LockSupport到底是何方神圣,现在...

weixin_34101784的博客 327

米哈游 AI产品经理面试题精选:10道高频考题+答案解析(附PDF)

米哈游是全球知名游戏开发商,以《原神》《崩坏》系列著称,专注二次元文化与AI技术创新。本文整理了10道AI产品经理面试题,涵盖Transformer架构、智能NPC设计、机器学习应用、AIGC产品规划等核心领域。题目既考察技术理解(如RAG原理、多模态模型),又关注产品落地(游戏平衡性优化、伦理安全),同时强调跨团队协作能力。参考答案均结合米哈游业务场景,体现技术驱动与玩家体验并重的产品思维,展现AI在游戏行业的创新应用前景。

ZHHHHH15的博客 682

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 265

JUC源码分析5-locks-LockSupport

LockSupport通过unsafe提供阻塞和唤醒线程的方法,AQS和其他的lock都会使用到这个基础类。 private LockSupport() {} // Cannot be instantiated. private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long parkBl

熊猫猫 818

【HarmonyOS】ArkUI的组件扩展

ArkuI的组件扩展主要是通过等装饰器来对于一些常用的自定义组件进行封装, 来简化UI开发流程, 提高自定义组件的可复用性。

2302_79763237的博客 1166

Java的LockSupport.park()实现分析

LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数: public native void unpark(Thread jthread); public native void park(boolean isAbsolute, long ti

横云断岭的专栏 5万+

KVM环境下Tesla T4/v100 vGPU性能调优手册:显存分配策略与帧率限制解除

本文深入探讨了在KVM虚拟化环境中,针对NVIDIA Tesla T4和V100 GPU进行vGPU性能调优的实战策略。核心内容包括如何根据AI训练、科学计算等不同负载,精细规划显存分配策略,并详细介绍了通过修改sysfs参数解除帧率限制器(FRL)以释放硬件潜力的方法,旨在帮助用户实现虚拟化GPU资源的最大化利用。

cuda7parallel的博客 619

四舵轮底盘运动学模型(源码)(四轮四独立转向)二

舵轮4转向活动范围 x 轴正半轴,x轴正方向为0弧度,左正右负, -M_PI/2 < 转向范围 < M_PI/2;移动底盘的正前方为x方向,左侧为y轴方向(遵循右手坐标系,右手大拇指指向天空为z轴方向,食指与中指垂直,食指指向小车正前方为x轴,中指指向为移动底盘y轴方向)转向:逆时针旋转角速度w为正,顺时针旋转角速度w为负。(遵循右手螺旋法则,右手握拳大拇指指向天空为旋转z轴方向,拳垂直于地面,4指方向即底盘转动的正方向)左前轮为1号轮,右前轮为2号轮,左后轮为3号轮,右后轮为4号轮。

苏凯的博客 527

Java并发-锁相关知识

LockSupport工具类 LockSupport是个工具类,是使用Unsafe类实现的,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。 LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。 park()方法 如果调用park方法的线程已经拿到了与LockSupport关联的许可证,则调用LockSupport.park()时会马上返回,否则调用线程会被禁止参与线程的调度,也就是会被阻塞挂起。 什么时候才p

solo_jm的博客 231

《QGIS快速入门与应用基础》230:添加图例工具

本文系统讲解QGIS图例制作的核心方法与优化技巧。首先强调图例与地图框的绑定逻辑,提出三种绑定状态及适用场景。详细拆解三种图例添加方法:布局工具栏一键添加法(新手首选)、菜单栏添加法和右键快捷创建法,并给出单地图框和多地图框两种典型场景的规范技巧。重点解决新手常见的图例杂乱、样式不规范、内容脱节等问题,帮助用户从基础图例制作进阶到符合行业标准的专业图例设计。通过分步操作图示和实用技巧,使读者能够快速掌握图例创建的核心流程与优化方法。

LuckyHanMo的博客 549

Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)

一、基本概念 1、进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等) 线程 一个进程之内可以分为一到多个线程

雾里 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

LockSupport详解:Java并发编程的基石

是用来创建锁和其他同步类的基本线程阻塞原语。它提供了一组静态方法,让线程可以阻塞(park)和唤醒(unpark)。阻塞方式锁释放使用位置唤醒方式适用场景不释放任意自动简单延时释放synchronized块notify线程间通信释放lock.lock()后signal高级锁不释放任意unpark底层工具知识点一句话总结核心功能线程阻塞(park)和唤醒(unpark)的基本原语底层实现基于Unsafe的park/unpark native方法许可机制。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3112

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java Review - 并发编程_LockSupport

位于rt.jar包的java.util.concurrent.locks目录中, 主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。

小工匠 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JAVA并发编程高级--LockSupport工具类详解

是Java并发编程中的一个重要工具类,它通过park()和unpark()方法提供了灵活的线程阻塞和唤醒机制。与传统的同步机制相比,更加灵活和安全,适用于复杂的并发场景。通过合理使用,可以实现高效的线程协作和同步控制。希望本文对大家理解有所帮助。如果还有其他问题,欢迎在评论区交流讨论!

weixin_45826852的博客 2011

Java并发编程之LockSupport、Unsafe详解

简介在Java多线程中,当需要阻塞或者唤醒一个线程是,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread)方法来唤醒一个被阻塞的线程,这些方法描述如...

Stay Hungry, Stay Foolish 1万+

Java并发编程之锁机制之LockSupport工具

长鼻子.jpg 关于文章涉及到的jdk源码,这里把最新的jdk源码分享给大家-----&gt;jdk源码 前言 在上篇文章《Java并发编程之锁机制之AQS(AbstractQueuedSynchronizer)》中我们了解了整个AQS的内部结构,与其独占式与共享式获取同步状态的实现。但是并没有详细描述线程是如何进行阻塞与唤醒的。我也提到了...

Andy博客 378

Java并发编程之LockSupport深度解析

本文深入解析Java并发工具类LockSupport的工作原理,通过源码分析揭示其基于Permit的线程阻塞/唤醒机制。结合自定义锁实现、阻塞队列构建等实战案例,系统讲解LockSupport在并发编程中的应用场景。通过与Object.wait/notify的对比分析,帮助开发者理解其设计优势与适用场景。

持续输出Java相关知识 570

深入理解Java并发编程中的LockSupport

Java并发编程中的LockSupport类是一个重要的工具,用于线程的阻塞和唤醒操作。相比传统的同步机制,LockSupport提供了更灵活、安全的线程同步方式。其基本概念包括park()和unpark()方法,通过操作系统提供的底层同步机制实现线程的阻塞和唤醒。LockSupport与synchronized、wait/notify相比具有更精细的线程控制能力,支持线程中断,避免了死锁问题。在实际应用中,LockSupport常用于自定义同步器和高性能并发场景,需要注意避免多次调用unpark()方法

q1372302825的博客 916

Java并发编程之LockSupport

Java并发编程之LockSupport 简介: LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次调用park会变成block(因为permit为0了,会阻塞在这里,直到p

zdl_csdn的博客 234

java并发编程-LockSupport中park与unpark基本使用与原理简单分析

文章目录java并发编程原理之---park与unpark基本使用情况一,代码举例与分析,先park再unpark情况二,代码举例与分析,先unpark再park特点原理之park & unpark情况一,先调用park,再调用unpark先调用park分析再调用unpark分析情况二,先调用unpark,再调用park先调用unpark,再调用park参考资料 java并发编程原理之—p...

mirana的专栏 6677

并发编程之LockSupport的 park 方法及线程中断响应

并发编程之LockSupport的 park 方法及线程中断响应

yemuxiaweiliang的博客 3148

LockSupport详解

LockSupport 是 Java 并发包(java.util.concurrent)中的一个工具类,提供了基本的线程阻塞和唤醒机制。它主要用于实现锁和其他同步类,如AQS、 ReentrantLock、Semaphore、CountDownLatch 等。LockSupport 提供的主要方法是park和unpark,它们分别用于挂起和唤醒线程(会让线程进入WATING状态)。AQS中对线程进行挂起和唤醒操作最终使用的就是和。AQS相关内容可以参考 我的上一篇博客AQS详解。

落日的博客 1793

【并发编程进阶6】ReentrantLock 和 LockSupport

首先明确下 synchronized 和 lock 接口均为可重入锁。重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。线程再次获取锁.锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。锁的最终释放.线程重复 n 次获取了锁,随后在第 n 次释放该锁后,其他线程能够获取到该锁.锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数等于 0 时表示锁已经成功释放。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 6735
上一篇: java并发编程的艺术(6)深入挖掘aqs独占锁源码
下一篇: java并发编程的艺术(8)深入解析ConcurrentHashMap
Danny_idea
博客等级 码龄10年 274粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值