AQS理解之一,基础知识——LockSupport
AQS理解之一,基础知识——LockSupport
LockSupport类位于java.util.concurrent包下。
顾名思义,就是一个实现锁的辅助类。
来看下他的类结构:
其中的变量都是通过UNSAFE类来赋值,代码如下:
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;static {try {UNSAFE = sun.misc.Unsafe.getUnsafe();Class<?> tk = Thread.class;parkBlockerOffset = UNSAFE.objectFieldOffset(tk.getDeclaredField("parkBlocker"));SEED = UNSAFE.objectFieldOffset(tk.getDeclaredField("threadLocalRandomSeed"));PROBE = UNSAFE.objectFieldOffset(tk.getDeclaredField("threadLocalRandomProbe"));SECONDARY = UNSAFE.objectFieldOffset(tk.getDeclaredField("threadLocalRandomSecondarySeed"));} catch (Exception ex) { throw new Error(ex); }}
parkBlockerOffset 是Thread类中的parkBlocker参数,其他参数类似。
parkBlockerOffset参数设置之后可以在jstack的时候对给这个变量设置了值的线程进行观察。
方法是park()和unpark(Thread t)和这两个方法的一些带时间参数方法。
通过看这个类的注释,可以知道park 和unpark实际上是对线程的阻塞与解除阻塞。
park: 阻塞线程,线程在一下三种情况下会被打开:
1.调用unpark方法,释放该线程的许可。
2.该线程被中断。
3.时间到期。
LockSupport的park和unpark操作的实际动作。
1.调用unpark
如果没有可用线程,则给定许可(permit就变成1(不会累计))
如果有线程被阻塞,解除锁,同时park返回。
如果给定线程没有启动,则该操作不能保证有任何效果.
2.调用park,则会检测permit是否为1。
如果为1则将permit变成0;
如果不为1,则堵塞线程,直到permit变为1.
我们知道wait和notify也可以实现对线程的阻塞和解除,他们的区别主要在于:
1,unpark会直接指定要解除阻塞的线程,而notify需要知道有一个确定的线程在wait,如果有多个线程在阻塞,则不能确定知道哪个会被解除阻塞。
2,wait和notify有先后顺序,即必须先wait,再notify才能解除,而park和unpark则没有,可以先给权限,再阻塞,阻塞会直接返回。
3,wait时线程如果被interrupt,会报错InterruptedException,而park时则会正常结束。
4,wait/notify面向对象,而LockSupport面向线程
AQS理解之一,基础知识——LockSupport相关推荐
- 什么是 ML.NET?应该如何理解机器学习基础知识?
ML.NET 是一个免费的开源跨平台机器学习框架,可用于生成自定义机器学习解决方案并将其集成到 .NET 应用程序. 借助 ML.NET API,可以使用你已有的 .NET 技能将 AI 结合到应用中 ...
- 学习笔记:Java 并发编程①_基础知识入门
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...
- [C#基础知识系列]专题十七:深入理解动态类型
本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善--Com 互 ...
- 与或非逻辑符号_理解FPGA的基础知识——逻辑电路
FPGA (Field Programmable Gate Aray,现场可编程门阵列)是一种可通过重新编程来实现用户所需逻辑电路的半导体器件.为了便于大家理解FPGA的设计和结构,我们先来简要介绍一 ...
- 计算机网络相关知识 参考博客 子网掩码怎么理解 网关及网关的作用 路由器基础知识详解
子网掩码怎么理解 https://blog.csdn.net/farmwang/article/details/64132723 网关及网关的作用 https://blog.csdn.net/zhao ...
- JMeter性能测试的基础知识和个人理解
JMeter性能测试的基础知识和个人理解 1. JMeter的简介 JMeter是Apache组织开发的开源项目,设计之初是用于做性能测试的,同时它在实现对各种接口的调用方面做的比较成熟,因此,常 ...
- 2021-03-15 深入理解SLAM技术【1】 基础知识
1 啥是SLAM? SLAM是真正的3d技术,是解决移动车辆的定位和动态地图生成的问题的.比如说,你要构造一个自主机器人,能实现路面行走,障碍规避,而且理解三维透视场景,甚至将这种场景翻译成几何场景, ...
- 最容易理解的计算机网络 基础知识概论(下)
文章目录 1.计算机网络的分类 1.1按照传输介质分类 1.2按照网络的使用者进行分类 1.3按照网络的规模和作用范围进行分类. 2.计算机网络的性能指标 2.1 带宽 2.2 时延 2.2.1网络时 ...
- 最容易理解的计算机网络的基础知识概论(上)
最容易理解的计算机网络基础知识概论(上) 1.计算机网络的分类方法 1)广域网. 2)城域网. 3)局域网. 4)个人区域网和人体区域网. 2.计算机的组成及结构 2.1早期计算机网络组成与结构 3 ...
最新文章
- 【资源】Faster R-CNN原理及代码讲解电子书
- ubuntu mysql 内存满了_ubuntu – 如何为mySQL分配内存限制?
- 一个 MVC 框架以 MVVM 之「魂」复活了!
- javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...
- php中调用脚本,PHP中如何调用RScript脚本(附代码)
- Git 将代码回到指定版本
- pycharm上传代码到github
- vs安装windows media player 1208
- Asp.NET生成静态页面并分页
- arXiv与文献调研神器Connected Papers强强联合
- centos 减少tty数量的方法
- 是逻辑运算符 java_跟我学java编程—Java逻辑运算符
- 有道云 语法高亮_antlr语法增强使用
- 迷宫问题python实现
- 对广州链家网二手房数据进行分析
- iOS 新浪微博客户端Demo实践之(六) 微博评论列表页面和发评论
- XFire野猪书-XFire开发指南第二版
- PDF 的命令行操作
- 共模干扰以及共模干扰消除方法
- 服务器固态硬盘连接,技术支招:服务器中固态硬盘如何选?
热门文章
- php codecept,Yii2 codecept unit 类找不到
- 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
- 时间序列分析模型:ARIMA模型和SARIMAX算法
- 三十三、深入Python中的itertools模块
- 一阶暂态电路三要素法和三种响应
- Hugging Face官方课程来了!Transformers库维护者之一授课,完全免费
- Googlenet笔记
- 飞桨第三课2020.4.2
- Bootstrap的坑--千万别踩
- pb数据窗口显示图片_HTAP数据库系列 | 企业级数据仓库如何应对个性化营销?