AQS深入分析
一、node概念
1、当线程获取锁失败时,会被打包成一个node放到同步队列中

2、node属性



当线程获取锁失败时,会被打包成一个node放到同步队列中,所以node属性中有一个thread属性;
3、condition中有一个等待队列

二、同步状态获取和释放源码实现

for(;;)自旋,编译后比while(true)执行指令少,就一行;
1、独占锁同步状态获取和实现
先尝试拿锁:

获取不到锁加入等待队列:

尾节点为空或者被其他线程改了,进入自旋:

自旋中,如果尾节点为空,则把首节点赋值给尾节点,不为空或者后面再判断时不为空,自己加到尾节点后面;
加入到同步队列中后:

节点开始在同步队列中自旋,判断自己前面是不是头节点,如果是就开始尝试获取锁:

如果前面不是头节点或者没有获取到锁,则自己进入阻塞状态:

头节点获取锁执行完之后,释放锁:

释放锁之后唤醒下一个成为头节点的节点中的线程:

三、condition等待队列


等待队列和同步队列存放的是结构一样的node节点;
正常情况下的线程会在同步队列中自旋,尝试获取锁,如果调用了await方法,则从同步队列中加入到等待队列中,阻塞,不再是自旋;
调用signal方法会从等待队列唤醒,转移到同步队列中,自旋取获取锁;
四、可重入锁
调用多次,锁的计数器一直加1,执行完一次就 -1,到0时候就释放锁;
不然自己占着锁,1 ,就无法原子操作 0->1,自己死锁;
五、共享锁
如读锁,可以被多个线程共同访问,status设置为10,拿一个减1,到0为止,释放一个再+1;
有点类似 Semaphore 工具类,做流控,防止一个资源被访问太多;
AQS深入分析的更多相关文章
- 六、显式锁和AQS
显式锁和AQS 一.显式锁 Synchronized 关键字结合对象的监视器,JVM 为我们提供了一种『内置锁』的语义,这种锁很简便,不需要我们关心加锁和释放锁的过程,我们只需要告诉虚拟机哪些代码 ...
- AQS源码深入分析之共享模式-你知道为什么AQS中要有PROPAGATE这个状态吗?
本文基于JDK-8u261源码分析 本篇文章为AQS系列文的第二篇,前文请看:[传送门] 第一篇:AQS源码深入分析之独占模式-ReentrantLock锁特性详解 1 Semaphore概览 共享模 ...
- AQS源码深入分析之独占模式-ReentrantLock锁特性详解
本文基于JDK-8u261源码分析 相信大部分人知道AQS是因为ReentrantLock,ReentrantLock的底层是使用AQS来实现的.还有一部分人知道共享锁(Semaphore/Count ...
- AQS源码深入分析之条件队列-你知道Java中的阻塞队列是如何实现的吗?
本文基于JDK-8u261源码分析 1 简介 因为CLH队列中的线程,什么线程获取到锁,什么线程进入队列排队,什么线程释放锁,这些都是不受我们控制的.所以条件队列的出现为我们提供了主动式地.只有满足指 ...
- 并发编程 20—— AbstractQueuedSynchronizer 深入分析
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 深入浅出AQS之独占锁模式
每一个Java工程师应该都或多或少了解过AQS,我自己也是前前后后,反反复复研究了很久,看了忘,忘了再看,每次都有不一样的体会.这次趁着写博客,打算重新拿出来系统的研究下它的源码,总结成文章,便于以后 ...
- 深入浅出AQS之共享锁模式
在了解了AQS独占锁模式以后,接下来再来看看共享锁的实现原理. 原文地址:http://www.jianshu.com/p/1161d33fc1d0 搞清楚AQS独占锁的实现原理之后,再看共享锁的实现 ...
- 深入浅出AQS之条件队列
相比于独占锁跟共享锁,AbstractQueuedSynchronizer中的条件队列可能被关注的并不是很多,但它在阻塞队列的实现里起着至关重要的作用,同时如果想全面了解AQS,条件队列也是必须要学习 ...
- 多线程-AbstractQueuedSynchronizer(AQS)
概述 从使用者的角度,AQS的功能可分为两类:独占功能和共享功能.它的子类中,要么实现并使用了它独占功能的API,要么使用了共享锁的功能,而不会同时使用两套API,即使是它的子类ReentrantRe ...
随机推荐
- Java面向对象01——什么是面向对象
面向过程&面向对象 面向过程思想(微观): 步骤清晰简单,第一步做什么,第二部做什么....... 面向过程适合处理一些较为简单的问题 面向对象思想(宏观): 物以类聚,分类的思维模式,思考问 ...
- Java基础——变量与常量及命名规范
变量 () public class Demon04{ //类变量 static static double salary=2500; //属性: 变量 //实例 ...
- git只提交部分修改的文件(提交指定文件)
在我们的项目中,经常会在本地编译一些代码,还未写完,测试那边来告诉你要改改某个文件的bug,非常着急,此时改完了,提交的时候,自己还在编译的代码并不想提交,此时,你可以利用git这些指令帮助你! 1/ ...
- 一键部署lamp脚本
#!/bin/bash systemctl stop firewalld systemctl disable firewalld setenforce 0 #-------Apache------ # ...
- QZEZTEST2021.7.27分析
T1 qzez 错误检测 题意 思路 代码 T2 qzez 比赛 题意 题面 有\(AB\)两队,每队\(n\)人,两队间进行\(n\)场比赛,每个人都要参赛,对手随机且概率均等.每人都有一个实力值, ...
- CVE-2020-17523:Apache Shiro身份认证绕过漏洞分析
0x01 Apache Shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理. 0x02 漏洞简介 2021年2月1日,Apache Shiro官 ...
- 题解 c(留坑)
传送门 这题卡常--而且目前还没有卡过去 首先以原树重心为根,向所有子树重心连边,可以建立一棵点分树 点分树有两个性质: 一个是树高只有log层 另一个是两点在点分树上的lca一定在原树上两点间的树上 ...
- Spring-JDBC表情符号不能存入数据库
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4; JDBC解决方案: //params List<Object> param ...
- linux命令别名
p.p1 { margin: 0; font: 20px Menlo; color: rgba(0, 0, 0, 1) } span.s1 { font-variant-ligatures: no-c ...
- C# 检测某版本VC++是否安装
一.根据微软的产品号GUID,调用msi.dll class Program { static void Main(string[] args) { if (GetProcuct("{GUI ...