当出现锁竞争以及释放锁的时候,AQS同步队列中的节点会发生变化,首先看一下添加节点的场景。

里会涉及到两个变化

1. 新的线程封装成Node节点追加到同步队列中,设置prev节点以及修改当前节点的前置节点的next节点指向自己

2. 通过CAS讲tail重新指向新的尾部节点 head节点表示获取锁成功的节点,当头结点在释放同步状态时,会唤醒后继节点,如果后继节点获得锁成功,会把自己设置为头结点,节点的变化过程如下

这个过程也是涉及到两个变化

1. 修改head节点指向下一个获得锁的节点

2. 新的获得锁的节点,将prev的指针指向null

设置head节点不需要用CAS,原因是设置head节点是由获得锁的线程来完成的,而同步锁只能由一个线程获得,所以不需要CAS保证,只需要把head节点设置为原首节点的后继节点,并且断开原head节点的next引用即可

释放锁以及添加线程对于队列的变化相关推荐

  1. java释放锁_java – 一个线程在完成后释放锁吗?

    简单测试可能会显示在线程终止时未释放锁定: import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock ...

  2. java中什么是释放已经持有的锁_java多线程什么时候释放锁

    由于等待一个锁定线程只有在获得这把锁之后,才能恢复运行,所以让持有锁的线程在不需要锁的时候及时释放锁是很重要的.在以下情况下,持有锁的线程会释放锁: 1.当前线程的同步方法.代码块执行结束的时候释放 ...

  3. 【Python爬虫学习笔记11】Queue线程安全队列和GIL全局解释器锁

    Queue线程安全队列 在Python多线程编程中,虽然threading模块为我们提供了Lock类和Condition类借助锁机制来处理线程并发执行,但在实际开发中使用加锁和释放锁仍是一个经常性的且 ...

  4. notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象

    notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] ...

  5. 等待队列中为什么需要互斥锁?一个线程在等待时被唤醒后会做什么?安全队列的代码实现

    多线程2 同步 作用 条件变量及其接口 初始化 静态初始化 动态初始化 等待接口 唤醒接口 销毁接口 代码实现 参数为什么需要互斥锁 在调用该接口时,pthread_cond_wait函数的实现逻辑是 ...

  6. Java中哪些操作会使线程释放锁资源

    1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放"锁标志".不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait() ...

  7. 线程同步时,哪些操作会释放锁?哪些操作不会释放锁?

    释放锁的操作: 1.当前线程的同步方法.同步代码块执行结束. 2.当前线程在同步代码块.同步方法中遇到break.return终止 了该代码块.该方法的继续执行. 3.当前线程在同步代码块.同步方法中 ...

  8. java线程释放_Java多线程出现异常会自动释放锁

    Java多线程出现异常会自动释放锁 package com.wkcto.intrinsiclock; /** * 同步过程中线程出现异常, 会自动释放锁对象 * * Author: 老崔 */ pub ...

  9. 【Java】哪些操作会使线程释放锁资源

    1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放"锁标志".不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait() ...

最新文章

  1. 最新开源LiDAR数据集LSOOD:四种常见的室外物体分类
  2. Netty消息接收类故障案例分析
  3. 嵌入式系统中对汉字的处理
  4. 深度学习核心技术精讲100篇(五十八)- 如何量化医学图像分割中的置信度?
  5. JAVA Roman to Integer 罗马数转换为int型方法
  6. (十一)进阶算法之“搜索排序”
  7. 软件工程实践2017第一次作业
  8. 深入理解Docker Volume(一)
  9. (11)FPGA跨时钟域问题导致数据偶尔异常(学无止境)
  10. 基于keras和tensorflow的yolo3物体检测
  11. 30天自己制作操作系统中二进制编辑器BZ-1621
  12. js视频播放器/video详解
  13. Java实现斗地主发牌
  14. python假分数约分_数学中假分数怎么约分
  15. 计算机主机闪烁显示器黑屏,显示器黑屏一闪一闪的怎么回事_显示器黑屏一闪一闪解决教程 - 系统家园...
  16. Python-OpenCV 读取和保存视频和解决保存失败的原因分析
  17. oracle dul 扫描磁盘,dul oracle 数据恢复
  18. ArcGis二次开发ArcEngine开篇
  19. 浮点数与IEEE754
  20. Polar SCL的C语言实现

热门文章

  1. PHP和MySQL入门(8)
  2. linux网卡开启GRO导致lvs 部分节点响应慢
  3. 在centos安装redis
  4. mysql 读写分离 ,mysql_proxy实现
  5. poj 3517
  6. 控件属性、事件持久化(转)
  7. zigbee 初识zigbee,ieee802,论坛
  8. 一个Json在线格式化的网站
  9. WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题解决方案
  10. selenium===使用docker搭建selenium分布式测试环境