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

浅聊一下,可中断锁(ReentrantLock)

前言

今天早上上厕所,上的我痔疮犯了,屁股一坐下去就感觉一根针在刺我,得的是外痔,之前还坚持用痔疮膏来着,但是感觉涂药的那个姿势以及位置我实在无法忍受,就把它给断了,到头来还是屁股糟了罪,

什么是可中断锁?

再说起 ReentrantLock 的时候可能很多人第一时间想到的是公平、非公平锁,但是 ReentrantLock 丰富的 api 可不止于此哦,可中断锁顾名思义,就是在竞争锁等待的时间太久,我们开发人员可以调用 interrupt(英特入谱特)方法让 lockInterruptibly (加锁可中断)方法抛出异常,让线程主动退出等待的过程,去做别的事情。

可中断锁应用

threadOne 进行 lockInterruptibly 加锁操作,由于锁一直被 threadOne 占用,当 threadTwo 开始进行 lockInterruptibly 加锁的时候,由于锁还在 threadOne 这,threadOne 会一直处于一个等待的状态,如果 threadOne 一直没有调用 unlock 方法,那么 threadTwo 会一直休眠,直至等到 unlock、或者 threadOne.interrupt() 方法才会再次被唤醒进行工作,而 ReentrantLock 显然也是考虑到了这一点,在 lockInterruptibly 方法里面,如果线程被唤醒后,会对线程的中断状态进行一个判断,如果线程被中断了,则会抛出一个异常,这样一来,就避免了 threadTwo 一直等待的现象出现了。

在这里插入图片描述

lockInterruptibly 源码剖析

点进入口中可以看到,是利用了 sync 里面的一个类实现的
在这里插入图片描述
而 sync 继承了 AQS (AbstractQueuedSynchronizer),哦吼又是借助 AQS 实现的。接下来我们只需分析 AQS 中的 acquireInterruptibly 方法就好了。

在这里插入图片描述
可以看到,如果是一个中断状态的线程去使用 lockInterruptibly 方法会直接抛出异常的,开发的时候要注意!里面的 tryAcquire 方法在我们分析公平、非公平锁的时候就已经分析过了,不做剖析。可以点击 ReentrantLock源码探究、探究公平锁与非公平锁背后的奥秘 进行阅读。那么就只剩下 doAcquireInterruptibly 了。
在这里插入图片描述

doAcquireInterruptibly 源码剖析

这段代码其实也在 ReentrantLock源码探究、探究公平锁与非公平锁背后的奥秘 这篇文章里面分析过了。和 AQS 中的 acquireQueued 这个方法逻辑一样,唯一有区别的地方就是,线程被唤醒后 doAcquireInterruptibly 会直接抛出一个异常,而 acquireQueued 则不会。
在这里插入图片描述
下面我贴一张我自己的截图,方便日后阅读~~~~~,到此 ReentrantLock 是可中断锁的秘密已经解开了。

在这里插入图片描述

线程中的 interrupt、park、interrupted、isInterrupted 是什么?

一个简单的小例子直观感受一下,threadOne 里面调用 parkAndCheckInterrupt 方法进行休眠(阻塞)线程的操作,然后等待被唤醒,过了 10 秒钟后 threadOne 自己调用了 interrupt 方法,将 park 休眠状态下的自己给唤醒了。值得一提的是 interrupted 方法被调用后,线程的中断状态会立即反转一次,之后看自己的中断状态即为反转后的状态。而且唤醒 threadOne 的方式不止一种,还可以使用 LockSupport.unpark(threadOne);

在这里插入图片描述

运行结果

在这里插入图片描述

http://www.lryc.cn/news/8050.html

相关文章:

  • 关于Arcgis林业数据处理的62个常用技巧
  • 一些NLP术语
  • Session详解,学习 Session对象一篇文章就够了
  • Java——不同的子序列
  • Git 基本操作之Git GUI界面和git命令行如何选择
  • Python编程 动态爱心
  • JavaScript :基础语法
  • buu [AFCTF2018]Single 1
  • Linux C++ 200行完成线程池类
  • C语言指针剖析(初阶) 最详细!
  • AcWing语法基础课笔记 第三章 C++中的循环结构
  • A simple freeD tracking protocol implementation written in golang
  • 简约精美电商小程序【源码好优多】
  • 全网详解 .npmrc 配置文件:比如.npmrc的优先级、命令行,如何配置.npmrc以及npm常用命令等
  • 从0开始学python -31
  • Jenkins的使用教程
  • 1.Maven的坐标和依赖
  • Jenkins 笔记
  • Python和Java语言,哪个更适合做自动化测试?
  • 互联网的路由选择协议
  • 接口幂等性处理
  • 数字孪生智慧机场:透视数字化时代下的航空运营
  • SpringBoot 文件上传后查看404的问题和解决404后需要访问两次才能查看的问题
  • 定时任务使用总结
  • Jira和Confluence Server版终止支持倒计时365天,企业应对策略汇总
  • GEE学习笔记九十一:栅格影像叠置分析
  • linux系统编程入门
  • JS代码安全防护常见的方式
  • PHP(13)HTTP协议
  • 基于支持向量机 (SVM) 用php实现预测气温