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相关推荐

  1. 什么是 ML.NET?应该如何理解机器学习基础知识?

    ML.NET 是一个免费的开源跨平台机器学习框架,可用于生成自定义机器学习解决方案并将其集成到 .NET 应用程序. 借助 ML.NET API,可以使用你已有的 .NET 技能将 AI 结合到应用中 ...

  2. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  3. [C#基础知识系列]专题十七:深入理解动态类型

    本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善--Com 互 ...

  4. 与或非逻辑符号_理解FPGA的基础知识——逻辑电路

    FPGA (Field Programmable Gate Aray,现场可编程门阵列)是一种可通过重新编程来实现用户所需逻辑电路的半导体器件.为了便于大家理解FPGA的设计和结构,我们先来简要介绍一 ...

  5. 计算机网络相关知识 参考博客 子网掩码怎么理解 网关及网关的作用 路由器基础知识详解

    子网掩码怎么理解 https://blog.csdn.net/farmwang/article/details/64132723 网关及网关的作用 https://blog.csdn.net/zhao ...

  6. JMeter性能测试的基础知识和个人理解

    JMeter性能测试的基础知识和个人理解 1. JMeter的简介   JMeter是Apache组织开发的开源项目,设计之初是用于做性能测试的,同时它在实现对各种接口的调用方面做的比较成熟,因此,常 ...

  7. 2021-03-15 深入理解SLAM技术【1】 基础知识

    1 啥是SLAM? SLAM是真正的3d技术,是解决移动车辆的定位和动态地图生成的问题的.比如说,你要构造一个自主机器人,能实现路面行走,障碍规避,而且理解三维透视场景,甚至将这种场景翻译成几何场景, ...

  8. 最容易理解的计算机网络 基础知识概论(下)

    文章目录 1.计算机网络的分类 1.1按照传输介质分类 1.2按照网络的使用者进行分类 1.3按照网络的规模和作用范围进行分类. 2.计算机网络的性能指标 2.1 带宽 2.2 时延 2.2.1网络时 ...

  9. 最容易理解的计算机网络的基础知识概论(上)

    最容易理解的计算机网络基础知识概论(上) 1.计算机网络的分类方法 1)广域网. 2)城域网. 3)局域网. 4)个人区域网和人体区域网. 2.计算机的组成及结构 2.1早期计算机网络组成与结构 3 ...

最新文章

  1. 【资源】Faster R-CNN原理及代码讲解电子书
  2. ubuntu mysql 内存满了_ubuntu – 如何为mySQL分配内存限制?
  3. 一个 MVC 框架以 MVVM 之「魂」复活了!
  4. javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...
  5. php中调用脚本,PHP中如何调用RScript脚本(附代码)
  6. Git 将代码回到指定版本
  7. pycharm上传代码到github
  8. vs安装windows media player 1208
  9. Asp.NET生成静态页面并分页
  10. arXiv与文献调研神器Connected Papers强强联合
  11. centos 减少tty数量的方法
  12. 是逻辑运算符 java_跟我学java编程—Java逻辑运算符
  13. 有道云 语法高亮_antlr语法增强使用
  14. 迷宫问题python实现
  15. 对广州链家网二手房数据进行分析
  16. iOS 新浪微博客户端Demo实践之(六) 微博评论列表页面和发评论
  17. XFire野猪书-XFire开发指南第二版
  18. PDF 的命令行操作
  19. 共模干扰以及共模干扰消除方法
  20. 服务器固态硬盘连接,技术支招:服务器中固态硬盘如何选?

热门文章

  1. php codecept,Yii2 codecept unit 类找不到
  2. 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
  3. 时间序列分析模型:ARIMA模型和SARIMAX算法
  4. 三十三、深入Python中的itertools模块
  5. 一阶暂态电路三要素法和三种响应
  6. Hugging Face官方课程来了!Transformers库维护者之一授课,完全免费
  7. Googlenet笔记
  8. 飞桨第三课2020.4.2
  9. Bootstrap的坑--千万别踩
  10. pb数据窗口显示图片_HTAP数据库系列 | 企业级数据仓库如何应对个性化营销?