当前位置: 首页 > 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;使得…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...