当前位置: 首页 > news >正文

Java Lock LockSupport 总结

前言


 相关系列

  • 《Java & Lock & 目录》(持续更新)
  • 《Java & Lock & LockSupport & 源码》(学习过程/多有漏误/仅作参考/不再更新)
  • 《Java & Lock & LockSupport & 总结》(学习总结/最新最准/持续更新)
  • 《Java & Lock & LockSupport & 问题》(学习解答/持续更新)
     
     

概述


 简介

    LockSupport @ 锁支持类是位于JUC包下基于“许可”对线程等待/唤醒进行控制的线程管理工具类。锁支持类对线程赋予了许可概念,并通过以1为单位对许可进行分配/消费来控制线程的状态在等待/运行之间相互切换。新创建启动的线程许可数量默认为0,并最多允许储存/透支一个许可,故而线程的许可数量只能在[-1, 0, 1]三个值之间波动,因此在线程许可数量达到高/低上限的情况下锁支持类对线程许可的分配/消费是没有意义的。

    新创建启动的线程会因为许可平衡(0)而处于运行状态,此时如果锁支持类消费了该线程的许可,则其将因为许可负债(-1)而进入有限/无限等待状态,在这种情况下正常只有分配、中断及超时才能令其许可平衡(0)而恢复运行。但如果锁支持类对许可平衡(0)的线程进行了许可分配,则线程将因为许可结余(1)而避免在下次许可消耗中因为许可负债(-1)而进入等待状态,即其会拥有一次等待的豁免权。

    因锁支持类而等待的线程在被中断唤醒后会在不抛出中断异常的同时保留中断状态。与因为Thread.sleep(long millis)方法而进入等待状态线程不同,因为许可负债(-1)而进入等待状态的线程在被中断唤醒后不会抛出中断异常,并会同时保留中断状态。因此对于锁支持类的调用者而言其可能需要基于需求人为地判断线程是否中断,并选择是否清除中断状态及抛出中断异常。

    因锁支持类而等待的线程可能发生虚假唤醒。所谓虚假唤醒是指等待线程在分配、中断及超时都未发生的情况下无理由唤醒的情况,因此对于线程许可的消费往往需要在循环中进行。循环的退出条件通常即为线程的唤醒条件,例如等待线程只有在某操作成功的情况下才会被唤醒,则被唤醒后的线程就需要去判断某操作是否已经执行成功,成功则退出循环执行下游代码;否则便再次进入等待状态,以此来避免因为虚假唤醒而导致的程序逻辑紊乱…相关调用示例如下:

while (!canProceed()) { ... LockSupport.park(this); 
}

 
 

方法


  • public static void park() —— 停泊 —— 消耗指当前线程的一个许可,消耗后如果当前线程许可负债(-1)则无限等待至因为信号、中断及虚假而唤醒为止;否则直接返回。

  • public static void park(Object blocker) —— 停泊 —— 消耗指当前线程的一个许可,消耗后如果当前线程许可负债(-1)则无限等待至因为信号、中断及虚假而唤醒为止;否则直接返回。

  • public static void parkNanos(long nanos) —— 停泊纳秒 —— 消耗指当前线程的一个许可,消耗后如果当前线程许可负债(-1)则在指定等待时间内有限等待至因为信号、中断、超时及虚假而唤醒为止;否则直接返回。

  • public static void parkNanos(Object blocker, long nanos) —— 停泊纳秒 —— 消耗指当前线程的一个许可,消耗后如果当前线程许可负债(-1)则在指定等待时间内有限等待至因为信号、中断、超时及虚假而唤醒为止;否则直接返回。

  • public static void parkUntil(long deadline) —— 停泊直至 —— 消耗指当前线程的一个许可,消耗后如果当前线程许可负债(-1)则在指定等待时间内有限等待至因为信号、中断、超时及虚假而唤醒为止;否则直接返回。该方法与parkNanos(…)方法的区别在于其是要等待至什么时间,而非要等待多少时间。

  • public static void parkUntil(Object blocker, long deadline) —— 停泊直至 —— 消耗指当前线程的一个许可,消耗后如果当前线程许可负债(-1)则在指定等待时间内有限等待至因为信号、中断、超时及虚假而唤醒为止;否则直接返回。该方法与parkNanos(…)方法的区别在于其是要等待至什么时间,而非要等待多少时间。

    可以发现,每个形式的停泊方法都会搭配一个功能完全相同但新增了阻塞者入参的同名方法。阻塞者的作用有些难以言明,但具体与探查/识别线程等待的状态有关。每个阻塞者形式的停泊方法都会在线程等待前将阻塞者存入线程,并于线程唤醒后清除,而在线程等待期间其它线程可以获取阻塞者对线程的等待进行状态、原因及时间等各项维度的探查,但探查的具体方式未知,这可能与阻塞者的自定义设计高度相关。

  • public static void unpark(Thread thread) —— 结束停泊 —— 为指定线程分配一个许可,如果指定线程原本许可负债(-1)而处于等待状态,则分配后将因为许可平衡(0)而恢复运行;如果指定线程原本许可平衡(0)而处于运行状态,则分配后将因为许可结余(1)而避免在下次许可消耗中因为许可负债(-1)而进入等待状态。
        注意!!!在线程尚未启动的情况,上述所有情况都不保证必然发生。

  • public static Object getBlocker(Thread t) —— 获取阻塞者 —— 获取指定线程的阻塞者快照,当指定线程正处于等待状态时正常返回;否则返回null。

  • static final int nextSecondarySeed() —— 下个次要种子 —— 基于当前线程的旧次要种子生成新的次要种子并保存/返回。当旧次要种子为0时说明其为初始值,通过随机分配的方式生成新次要种子。但如果新分配的次要种子依旧为0则需要在该情况下手动设置为1;如果旧次要种子不为0说明其已被更新过,通过位运算的方式生成新次要种子。

相关文章:

Java Lock LockSupport 总结

前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & LockSupport & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & LockSupport & 总结》(学习总结/最新…...

线性表之链式存储基本操作(c语言实现,附解析)

今天,我来讲一下数据结构链表的基本操作,首先我们要知道链表的基本操作有创建,查找,插入,删除。接下来我们逐一实现操作。 结构体定义 typedef struct Node* List; struct Node{ ElementType Data; List next; };文章…...

27.Redis哨兵架构

Redis哨兵高可用架构 Sentinel(哨兵)是一种特殊的 Redis 服务,其主要功能并非提供常规的读写服务,而是专门用于监控 Redis 实例节点。 1.在哨兵架构下,客户端(client 端)首次会从哨兵处找出 Re…...

BGP路由优选

BGP 的路由优选规则是一套多步决策链,用来确定在多个可行路由中选择最优的路由。BGP 是一种路径向量协议,通过这些优选规则,网络管理员可以控制数据流量的流向,确保网络的稳定性和效率。下面以一个实例来详细说明 BGP 的优选规则及…...

cjson内存泄漏问题注意事项

(1)使用root cJSON_Parse(text); //将字符串转成json格式,函数中申请了一块内存给root 所以在最后要释放root cJSON_Delete(root ); //释放cJSON_Parse()分配出来的内存空间 (2)使用out cJSON_Print(root);(含有cJSON_PrintUnformatted函数&#x…...

雷军救WPS“三次”,WPS注入新生力量,不再“抄袭”微软

救WPS“三次” 1989年,求伯君用128万行代码编写出了WPS1.0,宣告了中国自主办公时代的开启。 那时候,雷军还在武汉大学深造,他早就把求伯君当成了自己的榜样,这一来二去的,雷军和WPS之间也就结下了不解之缘…...

zookeeper全系列学习之分布式锁实现

文章目录 前言一、分布式锁的通用实现思路二、ZK实现分布式锁的思路三、ZK实现分布式锁的编码实现1、核心工具类实现2、测试代码编写线程安全问题复现使用上面封装的ZkLockHelper实现的分布式锁 优点缺点 总结 前言 就像上篇文章zookeeper全系列学习之统一配置获取说的&#x…...

耐用的内衣洗衣机有哪些?双11好用内衣洗衣机品牌排行榜

现代社会高速发展,人们对于生活品质的追求不断提高,内衣作为贴身衣物,其清洁程度直接关系到个人卫生和健康。因此,耐用且高效的内衣洗衣机成为了许多家庭的必需品。在双11购物节期间,众多品牌推出了各种优惠活动&#…...

富格林:曝光可信经验击败陷阱

富格林认为,现货黄金投资是一项收益与风险并存的交易活动。在现货黄金中,时常为投资者曝光总结一些可信的交易经验,能在必要时帮助投资者击败陷阱,同时也会获得较高概率的收益。如今的投资经验和策略是非常多的,以下是…...

3211、生成不含相邻零的二进制字符串-cangjie

题目 3211、生成不含相邻零的二进制字符串 思路 dfs 代码 class Solution {let numRune [r0, r1]func dfs(arr: ArrayList<Rune>, ans: ArrayList<String>,n: Int64):Unit{if(arr.size > n){ans.insert(0, String(arr))// println("insert ${String(…...

【wpf】wpf程序联合控制台测试

如果在wpf的工程里面&#xff0c;想通过控制台输出或者调试&#xff0c;可以点开项目属性&#xff0c;把输出输出类型改为控制台应用输出&#xff0c;这样调试程序时&#xff0c;wpf的界面和控制台界面都会同时打开&#xff0c;而且写的控制台代码都会有效&#xff01; 设置如…...

使用 Spring Doc 为 Spring REST API 生成 OpenAPI 3.0 文档

Spring Boot 3 整合 springdoc-openapi 概述 springdoc-openapi 是一个用于自动生成 OpenAPI 3.0 文档的库&#xff0c;它支持与 Spring Boot 无缝集成。通过这个库&#xff0c;你可以轻松地生成和展示 RESTful API 的文档&#xff0c;并且可以使用 Swagger UI 或 ReDoc 进行…...

ssm基于ssm框架的滁艺咖啡在线销售系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 第1章 绪论 1 1.1选题动因 1 1.2目的和意义 1 1.3论文结构安排 2 第2章 开发环境与技术 3 2.1 MYSQ…...

微信小程序 - 动画(Animation)执行过程 / 实现过程 / 实现方式

前言 因官方文档描述不清晰,本文主要介绍微信小程序动画 实现过程 / 实现方式。 实现过程 推荐你对照 官方文档 来看本文章,这样更有利于理解。 简单来说,整个动画实现过程就三步: 创建一个动画实例 animation。调用实例的方法来描述动画。最后通过动画实例的 export 方法…...

【Linux】nohup 命令

【Linux】nohup 命令 1. 语法格式2. 实例3. 查找后台进程 nohup 英文全称 no hang up&#xff08;不挂起&#xff09;&#xff0c;用于在系统后台不挂断地运行命令&#xff0c;退出终端不会影响程序的运行。 nohup 命令&#xff0c;在默认情况下&#xff08;非重定向时&#x…...

CSS、Less、Scss

CSS、Less和SCSS都是用于描述网页外观的样式表语言&#xff0c;但它们各自具有不同的特点和功能。以下是对这三者的详细阐述及区别对比&#xff1a; 详细阐述 CSS&#xff08;Cascading Style Sheets&#xff09; 定义&#xff1a;CSS是一种用来表现HTML或XML等文件样式的计算机…...

[笔记] ffmpeg docker编译环境搭建

文章目录 环境参考dockerfile 文件步骤常见问题docker 构建镜像出现 INTERNAL_ERROR 失败? 总结 环境 docker 环境 系统centos 7.9 (无所谓了 你用docker编译就无所谓系统了) ffmpeg3.3 参考 https://blog.csdn.net/jiedichina/article/details/71438112 dockerfile 文件 …...

基于SSM的心理咨询管理管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的心理咨询管理管理系统拥有三个角色&#xff1a;学生用户、咨询师、管理员 管理员&#xff1a;学生管理、咨询师管理、文档信息管理、预约信息管理、测试题目管理、测试信息管理…...

南开大学《2023年+2022年810自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《南开大学810自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2023年真题 2022年真题 Part1&#xff1a;2023年2022年完整版真题 2023年真题 2022年真题…...

【算法】Kruskal最小生成树算法

目录 一、最小生成树 二、Kruskal算法求最小生成树 三、代码 一、最小生成树 什么是最小生成树&#xff1f; 对于一个n个节点的带权图&#xff0c;从中选出n-1条边&#xff08;保持每个节点的联通&#xff09;构成一棵树&#xff08;不能带环&#xff09;&#xff0c;使得…...

新手入门实战:从零复现简易情绪记录站,掌握Web开发基础

最近在自学前端开发&#xff0c;想找个简单又有趣的练手项目。发现情绪记录网站是个不错的切入点&#xff0c;既能练习基础技能&#xff0c;又能做出实用功能。今天就用InsCode(快马)平台复现了一个简易版&#xff0c;分享下实现过程和心得。 项目构思 这个"私密树洞"…...

ChromePass终极指南:浏览器密码提取与安全管理完全攻略

ChromePass终极指南&#xff1a;浏览器密码提取与安全管理完全攻略 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 副标题&#xff1a;从密码危机到数据掌控&#xff1a;3步实现…...

用LDA模型挖掘微信聊天秘密:Gensim实战教程(含pyLDAvis可视化)

用LDA模型挖掘微信聊天秘密&#xff1a;Gensim实战教程&#xff08;含pyLDAvis可视化&#xff09; 微信聊天记录中隐藏着大量有价值的信息&#xff0c;从日常对话到重要决策&#xff0c;这些文本数据就像一座未被充分挖掘的金矿。本文将带你用Python中的Gensim库构建LDA主题模型…...

从AlexNet到ResNet:图解十大经典CV网络模型,帮你快速选对项目‘骨架’

从AlexNet到ResNet&#xff1a;十大经典CV网络模型实战选型指南 当你第一次面对ImageNet数据集时&#xff0c;可能会被各种网络架构的选择弄得眼花缭乱。VGG的深度堆叠、GoogLeNet的并行结构、ResNet的短路连接——这些设计理念背后&#xff0c;是计算机视觉领域十年来的智慧结…...

根据您提供的写作范围,我为您总结的标题为:“昆通泰MCGS7.7嵌入版:6车位停车场监控系统仿...

6车位停车场监控系统昆通泰MCGS7.7嵌入版仿真运行带运行效果视频6车位停车场监控系统用昆通泰MCGS7.7嵌入版做仿真&#xff0c;真的是新手友好型项目——不用扛硬件、不用接复杂通讯&#xff0c;靠内部变量和几段脚本就能把核心逻辑跑通&#xff0c;还能直观看到实时效果&#…...

OpenCore辅助工具(OCAT)全攻略:从配置到优化的黑苹果必备工具

OpenCore辅助工具(OCAT)全攻略&#xff1a;从配置到优化的黑苹果必备工具 【免费下载链接】OCAuxiliaryTools Cross-platform GUI management tools for OpenCore&#xff08;OCAT&#xff09; 项目地址: https://gitcode.com/gh_mirrors/oc/OCAuxiliaryTools 核心价值&…...

Qwen3-0.6B-FP8多语言落地:支持粤语、闽南语、藏语等方言指令理解实测

Qwen3-0.6B-FP8多语言落地&#xff1a;支持粤语、闽南语、藏语等方言指令理解实测 1. 引言&#xff1a;当AI能听懂你的家乡话 想象一下&#xff0c;你正在用粤语和AI助手聊天&#xff0c;让它帮你写一份工作报告&#xff1b;或者用闽南语问它今天的天气&#xff0c;它不仅能听…...

Agent-S智能自动化框架:企业级系统集成的技术解决方案

Agent-S智能自动化框架&#xff1a;企业级系统集成的技术解决方案 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S 在当今快速发展的数字化转型浪潮中&#…...

Pandoc:5步掌握全能文档转换的极简工作流

Pandoc&#xff1a;5步掌握全能文档转换的极简工作流 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 价值定位&#xff1a;为什么每个开发者都需要一款"格式翻译官" 当你需要将Markdown笔记转换为…...

文明降级运动:回归纸笔抵抗AI监控

在AI技术席卷软件测试领域的浪潮中&#xff0c;一个看似“倒退”却极具战略意义的趋势正在兴起——文明降级运动。这场运动的核心是主动回归纸笔工具&#xff0c;以抵抗AI监控带来的系统性风险。作为软件测试从业者&#xff0c;我们身处技术前沿&#xff0c;见证了AI在缺陷预测…...