首页 > 编程语言 >说说Java的AbstractQueuedSynchronizer

说说Java的AbstractQueuedSynchronizer

时间:2024-01-23 23:56:30浏览次数:27  
标签:Java AQS AbstractQueuedSynchronizer 获取 state 线程 节点

Java中的Lock锁,都是基于AQS,也就是AbstractQueuedSynchronizer。那么AbstractQueuedSynchronizer又是基于什么原理来做锁的呢?

一:锁原理

1.  怎么算获取到了锁?

AQS内置了一个volatile int state字段,利用CAS保证并发安全,当state=0表示没没有线程占用。只要线程设置了state(比如置为1,如果

是可重入锁,state可以>1),就表示获取了锁。

 

2. 线程竞争时如何保存竞争的线程?

AQS内置了一个双链表,当线程存在竞争时,会先放入这个双链表的尾部。当然,这个放入的动作,也要保证并发安全,这里也是使用了

CAS原子操作,死循环执行这个放入动作直至成功。

 

3. 竞争线程保存后如何获取锁?

AQS做的很简单,直接死循环尝试获取锁直至成功。具体思路为:

3.1   取当前线程所属节点的上一个节点A。

3.2   如果节点A为头结点,则当前线程尝试获取锁。

3.3   没有获取到锁,则循环3.1 、 3.2

3.4   当获取到锁后,将当前节点置为头结点。这样,排在后边的节点,就会开始获取锁。

之所以要先判断上一个节点为头结点才尝试获取锁,主要有两个原因:

一:CAS操作相对于单纯的判断更加吃CPU。

二:这样保证了获取锁的公平性,方便公平锁的实现。

 

4.  锁释放

各种不同类型的锁,锁释放思路不同。但是都要刷 state=state-1。

 

 

二:AQS的优点

可以实现语义更加丰富的锁,比如读写锁、公平锁、非公平锁。 

 

标签:Java,AQS,AbstractQueuedSynchronizer,获取,state,线程,节点
From: https://www.cnblogs.com/kingcode/p/17982990

相关文章

  • Java流程控制
    Java流程控制1、用户交互Scanner之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特性,我们可以通过Scanner类来获取用户的输入。基本语法Scanners=newScanner(System.in)......
  • Java运行时数据区域
    运行时数据区域程序计数器(ProgramCounterRegister)当前线程所执行的字节码行号指示器(逻辑)通过改变计数器的值来选取下一条需要执行的字节码指令和线程一对一的关系,即“线程私有”对Java方法计数,如果是Native方法则计数器值为Undefined只是计数,不会发生内存泄漏J......
  • JAVA键盘输入语句
    介绍步骤案例点击查看代码importjava.util.Scanner;//表示把java.util下的Scanner类导入publicclassInput{//类名要与文件名一致//编写一个main方法publicstaticvoidmain(String[]args){ //演示接受用户的输入 //步骤 //Scanner类表示简单文本扫描......
  • 《Java核心编程》PDF
    内容简介本书主要基于Java13来介绍Java核心编程相关的知识点,以及从Java8至Java13以来的新特性,主要内容包括:Java语言基础、面向对象编程、集合框架、异常处理、I/O处理、网络编程、并发编程、基本编程结构的改进、垃圾回收器的增强、使用脚本语言、Lambda表达式与函数式编程、St......
  • 【APP逆向10】Java中常见加密与python实现
    1.隐藏字节,Stringv4=newString(newbyte[]{-26,-83,-90,-26,-78,-101,-23,-67,-112});byte_list=[-26,-83,-90,-26,-78,-101,-23,-67,-112]bs=bytearray()#python字节数组foriteminbyte_list:ifitem<0:item=item+256......
  • Java学习日记 Day9 今天小摆烂,明天加油~
    Spring框架:①IOC:简单说就是把创建对象的任务交给了配置文件,降低了代码耦合。②DI:IOC实现创建对象的任务后DI技术可以为在配置文件中为对象赋值。③代理模式:代替一个对象完成任务,分为静态代理和动态代理,动态代理有JDK和CGLIB两种,前者只可以对接口中的方法实现增强,而后者也可以对......
  • java基础面试知识点
    学习自javaGuideJava语言有哪些特点简单易学面向对象(封装,继承,多态)平台无关性(Java虚拟机实现平台无关性)支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而Java语言却提供了多线程支持)可靠性(具备异常处理和自动内存管理......
  • 19_Java流程控制01-Scanner进阶使用
    Scanner进阶使用整数:hasNextInt()——nextInt()小数:hasNextFloat()——nextFloat()if:判断语句while:循环语句练习:循环输入,求和与平均数,回车确认,非数字结束指令并输出结果。Scannerscanner=newScanner(System.in);//开始doublesum=0;intm=0;System.out.println("请输......
  • Java高级实战--高级开发和架构师的秘籍
    本JavaWeb高级实战教程全网最强!本教程是实际项目中真正会用到的技术,学完就能成为真正的技术大佬,有亮点的大佬!此教程包含:高并发、项目架构、全局处理、自动化处理、链路追踪、应用监控等,也包含Spring、SpringMVC、SpringBoot、Redis、MQ的高级用法等。很多人有这样的困惑:工作已经是......
  • Java高级实战--高级开发和架构师的秘籍
    ​本JavaWeb高级实战教程全网最强!本教程是实际项目中真正会用到的技术,学完就能成为真正的技术大佬,有亮点的大佬!此教程包含:高并发、项目架构、全局处理、自动化处理、链路追踪、应用监控等,也包含Spring、SpringMVC、SpringBoot、Redis、MQ的高级用法等。很多人有这样的困惑:工作已......