释放锁以及添加线程对于队列的变化
当出现锁竞争以及释放锁的时候,AQS同步队列中的节点会发生变化,首先看一下添加节点的场景。
里会涉及到两个变化
1. 新的线程封装成Node节点追加到同步队列中,设置prev节点以及修改当前节点的前置节点的next节点指向自己
2. 通过CAS讲tail重新指向新的尾部节点 head节点表示获取锁成功的节点,当头结点在释放同步状态时,会唤醒后继节点,如果后继节点获得锁成功,会把自己设置为头结点,节点的变化过程如下
这个过程也是涉及到两个变化
1. 修改head节点指向下一个获得锁的节点
2. 新的获得锁的节点,将prev的指针指向null
设置head节点不需要用CAS,原因是设置head节点是由获得锁的线程来完成的,而同步锁只能由一个线程获得,所以不需要CAS保证,只需要把head节点设置为原首节点的后继节点,并且断开原head节点的next引用即可
释放锁以及添加线程对于队列的变化相关推荐
- java释放锁_java – 一个线程在完成后释放锁吗?
简单测试可能会显示在线程终止时未释放锁定: import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock ...
- java中什么是释放已经持有的锁_java多线程什么时候释放锁
由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁: 1.当前线程的同步方法.代码块执行结束的时候释放 ...
- 【Python爬虫学习笔记11】Queue线程安全队列和GIL全局解释器锁
Queue线程安全队列 在Python多线程编程中,虽然threading模块为我们提供了Lock类和Condition类借助锁机制来处理线程并发执行,但在实际开发中使用加锁和释放锁仍是一个经常性的且 ...
- notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象
notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] ...
- 等待队列中为什么需要互斥锁?一个线程在等待时被唤醒后会做什么?安全队列的代码实现
多线程2 同步 作用 条件变量及其接口 初始化 静态初始化 动态初始化 等待接口 唤醒接口 销毁接口 代码实现 参数为什么需要互斥锁 在调用该接口时,pthread_cond_wait函数的实现逻辑是 ...
- Java中哪些操作会使线程释放锁资源
1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放"锁标志".不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait() ...
- 线程同步时,哪些操作会释放锁?哪些操作不会释放锁?
释放锁的操作: 1.当前线程的同步方法.同步代码块执行结束. 2.当前线程在同步代码块.同步方法中遇到break.return终止 了该代码块.该方法的继续执行. 3.当前线程在同步代码块.同步方法中 ...
- java线程释放_Java多线程出现异常会自动释放锁
Java多线程出现异常会自动释放锁 package com.wkcto.intrinsiclock; /** * 同步过程中线程出现异常, 会自动释放锁对象 * * Author: 老崔 */ pub ...
- 【Java】哪些操作会使线程释放锁资源
1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放"锁标志".不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait() ...
最新文章
- 最新开源LiDAR数据集LSOOD:四种常见的室外物体分类
- Netty消息接收类故障案例分析
- 嵌入式系统中对汉字的处理
- 深度学习核心技术精讲100篇(五十八)- 如何量化医学图像分割中的置信度?
- JAVA Roman to Integer 罗马数转换为int型方法
- (十一)进阶算法之“搜索排序”
- 软件工程实践2017第一次作业
- 深入理解Docker Volume(一)
- (11)FPGA跨时钟域问题导致数据偶尔异常(学无止境)
- 基于keras和tensorflow的yolo3物体检测
- 30天自己制作操作系统中二进制编辑器BZ-1621
- js视频播放器/video详解
- Java实现斗地主发牌
- python假分数约分_数学中假分数怎么约分
- 计算机主机闪烁显示器黑屏,显示器黑屏一闪一闪的怎么回事_显示器黑屏一闪一闪解决教程 - 系统家园...
- Python-OpenCV 读取和保存视频和解决保存失败的原因分析
- oracle dul 扫描磁盘,dul oracle 数据恢复
- ArcGis二次开发ArcEngine开篇
- 浮点数与IEEE754
- Polar SCL的C语言实现