JUC之AQS

AQS抽象的队列同步器

public abstract class AbstractQueuedSynchronizerextends AbstractOwnableSynchronizerimplements java.io.Serializable {

AbstractQueuedSynchronizer 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现,是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给谁的问题。
整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态。
在这里插入图片描述
和AQS有关的锁
在这里插入图片描述
**锁,面向锁的使用者。**定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可。
同步器,面向锁的实现者。 统一规范并简化了锁的实现,将其抽象出来屏蔽了同步状态管理,同步队列的管理和维护、阻塞线程队列和通知、唤醒机制等,是一切锁和同步组件实现的--------公共基础部分。
加锁会导致阻塞 有阻塞就需要排队,实现排队必然需要队列
在这里插入图片描述
在这里插入图片描述
源码实现
在这里插入图片描述
AQS使用一个volatile的int类型的成员变量来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作。将每条要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改。

在这里插入图片描述
在这里插入图片描述
节点的State状态,也就是Node节点的waitstatus的状态
在这里插入图片描述
在这里插入图片描述ReentrantLock的原理
在这里插入图片描述
公平与非公平的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从非公平锁看起
在这里插入图片描述
在这里插入图片描述
重点是acquire方法里面三个方法的使用

 public final void acquire(int arg) {if (!tryAcquire(arg) &&acquireQueued(addWaiter(Node.EXCLUSIVE), arg))selfInterrupt();}

在这里插入图片描述
三个方法以及三大流向
在这里插入图片描述
在这里插入图片描述
动画演示

初始状态state=0
在这里插入图片描述
Thread A 占有后
在这里插入图片描述
首先进入队列后,构造一个哨兵节点
在这里插入图片描述
第二个线程B进来后,构造对应的节点B,并且尾指针指向该节点,变为尾节点
在这里插入图片描述
虚拟节点的下一个节点指向节点B,B节点入队完成
在这里插入图片描述
在这里插入图片描述

相关的代码逻辑
在这里插入图片描述
线程C 的节点C入队在这里插入图片描述

流程3,acquireQueued修改节点的前驱节点的waitstatus=-1,处于等待被唤醒的状态
在这里插入图片描述
线程A unlock释放锁后,state变为0,线程的占有变为null
在这里插入图片描述
unparkSuccessor 头节点唤醒后继节点,B节点占位成功,B节点的之前的前驱节点虚拟节点出队,B节点的thread设置为null,变为新的虚拟头节点
在这里插入图片描述
模拟节点的取消流程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
tryacquire方法

公平锁
在这里插入图片描述
addWaiter 加入队列的方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
acquireQueued的核心方法
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程—DAY3

模拟面试 1.什么是IP地址 是给互联网上的每台主机分配的唯一标识 2.IP地址和mac地址的区别 mac地址是设备的硬件地址,ip地址是给主机分配的网络地址 3.当电脑从一个网络切换到另一个网络哪个会变 ip地址会变,mac地址不会变 4.什么是端口号 用于区…

不锈钢多功能电工剥线钳分线绕线剪线剥线钳剥线压线扒皮钳子

品牌:银隆 型号:089B绿色 材质:镍铬钢(不锈钢) 颜色分类:089B灰色,089B红色,089B绿色,089B黑色,089B橙色 功能齐集一身,一钳多用,多功能剥线钳。剥线,剪线&#xff…

Find My游戏机|苹果Find My技术与游戏机结合,智能防丢,全球定位

游戏机,又名电子游乐器是使用游戏软件进行玩乐的机器。依照进行游戏的方式的不同,又分为家用游戏机及掌上游戏机。游戏机也可以说是属于电脑的一种,电子游戏机针对影像、音效与操作机能进行特别的强化,也有各种的软件和硬件可供安…

wordpress子比主题7.6美化插件及新手零基础搭建教程源码下载

版权申请:本文A5资源网原创,经原创作者允许转载许可声明。下载地址http://a5.org.cn/a5_ziyuan/39172.html 本源码由网友在某宝二十几元购买,现分享给大家。下图为源码文件及演示图,安装教程比较详细新手零基础就可搭建 子比主…

FTP基本配置(vsftpd.conf)文件讲解

本地用户有关配置选项 选项说明默认值local_enable是否允许本地用户登录YESlocal_root设置本地用户登录后的根目录一般为用户的家目录local_umask本地用户上传文件的umask值,默认为077,对应文件权限为700077chroot_local_user是否将所有用户禁锢在根目录…

SpringBoot打造企业级进销存储系统 第七讲

Transientprivate String roles; // 所拥有的角色package com.java1234.entity;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.p…

交流互动系统|基于springboot框架+ Mysql+Java+Tomcat的交流互动系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…

RoketMQ主从搭建

vim /etc/hosts# IP与域名映射,端口看自己的#nameserver 192.168.126.132 rocketmq-nameserver1 192.168.126.133 rocketmq-nameserver2# 注意主从节点不在同一个主机上 #broker 192.168.126.132 rocketmq-master1 192.168.126.133 rocketmq-master2#broker 192.168…

EMQX+InfluxDB+Grafana 构建物联网可视化平台

EMQXInfluxDBGrafana 构建物联网可视化平台 本文以常见物联网使用场景为例,介绍了如何利用 EMQ X MQTT 服务器 InfluxDB Grafana 构建物联网数据可视化平台,将物联网设备上传的时序数据便捷地展现出来。 在物联网项目中接入平台的设备数据和数据存储…

zookeeper快速入门四:在java客户端中操作zookeeper

系列文章&#xff1a; zookeeper快速入门一&#xff1a;zookeeper安装与启动-CSDN博客 zookeeper快速入门二&#xff1a;zookeeper基本概念-CSDN博客 zookeeper快速入门三&#xff1a;zookeeper的基本操作 先启动zookeeper服务端。 在maven引入zookeeper依赖。 <depende…

[java基础揉碎]Object类详解

目录 equals方法: hashCode: toString: finalize: equals方法: 和equals对比 1.: 既可以判断基本类型&#xff0c;又可以判断引用类型 2.: 如果判断基本类型&#xff0c;判断的是值是否相等。示例: int i10; double d10.0; 3.:如果判断引用类型&#xff0c;判断的是地址是…

Linux 16个常用脚本(初级)练习

&#xff08;1&#xff09;编写脚本&#xff1a;提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户 #!/bin/bash # 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户 # 不输入账户名,则提示必须输入账户名并退出脚本;如果用…

MySQL语法分类 DQL(6)分页查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

reloading,一个很实用的Python库!

Python是一门非常流行的编程语言&#xff0c;它的广泛应用和丰富的第三方库使得开发者们能够轻松完成各种任务。reloading是Python中一个强大的库&#xff0c;它能够在程序运行时重新加载修改过的模块&#xff0c;为开发者提供了便利和灵活性。本文将全面介绍reloading库&#…

【STM32 定时器(二)TIM 输入捕获PWM 总结】

STM32定时器之输入捕获总结 OC介绍PWM介绍PWM初始化代码部分开启时钟配置时基单元配置CCR配置GPIO配置复用和重定义功能 开启定时器代码实现 &#xff1a;实现呼吸灯 OC介绍 PWM介绍 PWM参数计算 分辨率越细&#xff0c;分的分量越精细&#xff0c;越稳定&#xff0c;假如它为…

Kafka(十)安全

目录 Kafka安全1 安全协议1.1 PALINTEXT1.2 SSL1.2.1 生成服务端证书1.2.2 生成客户端证书1.2.3 修改配置listenersadvertised.listenerslistener.security.protocol.mapinter.broker.listener.namesecurity.inter.broker.protocolcontrol.plane.listener.name 1.3 SASL_PLAINT…

面向对象8

面向对象8 main()方法的剖析 public static void main(String args[]){} 1、理解1&#xff1a;看做是一个普通的静态方法 理解2&#xff1a;看做是程序的入口&#xff0c;格式是固定的。 2、与控制台交互 如何从键盘获取数据&#xff1f; 方式1&#xff1a;使用Scanner 方…

网络学习:IPV6地址详解

目录 前言&#xff1a; 一、IPV6的由来 二、什么是IPV6地址&#xff1f; IPV6地址结构&#xff1a; 前言&#xff1a; IPV6&#xff08;Internet Protocol Version 6&#xff09;是网络层协议的第二代标准协议&#xff0c;也被称为IPng&#xff08;IP Next Generation&…

ELK之使用Filebeat插件收集日志到Logstash

对于Springboot项目接入ELK非常方便&#xff0c;对于非maven&#xff0c;非Spring项目来说就比较复杂&#xff0c;这个时候我们就可以使用Filebeat插件还完成日志的收集发送工作。 Filebeat介绍 Filebeat是用于转发和收集数据的轻量级工具&#xff0c;Filebeat可以监视指定的…

内存泄露与解决

什么是内存泄漏 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在 哪些操作会造成内存泄漏&#xff1f; 1、垃圾回收器定期扫描对象&#xff0c;并计算引用了每个对象的其他对象的数量。如果一个对象的 引用数量为 0&#xff08;没有其他对象引用过该对象&#xff09;&…