首页 > 编程语言 >JAVA并发编程AQS原理剖析

JAVA并发编程AQS原理剖析

时间:2024-09-10 18:21:18浏览次数:11  
标签:Node JAVA AQS 队列 编程 线程 原理 节点

很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》《JUC包之CAS原理》《volatile核心原理》《synchronized全能王的原理》,希望可以帮到大家巩固相关核心技术原理。今天我们聊聊AQS....

一、AQS是什么,有什么用

       AQS全称是:AbstractQueuedSynchronizer,队列同步器。这个类在JUC包java.util.concurrent.locks下面。

        一句话总结:AQS是FIFO先进先出双向队列,队列里存的是线程Thread。

       说到双向链表,这回大家就不陌生了。通过head、tail节点来记录队列的头和尾。每个Node节点都有next、pre来串联前后节点组成双向链表。

      AQS同步队列,就是通过在FIFO队列里存储线程的状态,实现类只需要extends abstractQueuedSynchronizer,并实现里面的方法,就可以自定义自己同步机制。为什么面试官喜欢问AQS,因为AQS队列同步器在JUC包里应用太广泛了,你所熟悉的ReentrantLock、Semaphore信号量、FutureTask,CountDownLatch,你翻一番源码,都是extend abstractQueuedSynchronizer去实现的。等你说完AQS原理,就可以继续问它的实现...面试官考察套路太深。

       一句话总结:AQS可以用来实现线程同步机制。在JUC包里有广泛应用。可以说AQS就是JUC的灵魂。

二、AQS的原理源码分析

        我们直接看源码说原理,AQS队列同步器核心三个变量:head节点、tail节点、state状态码。

       核心原理:队列中的每个节点对应一个线程。线程通过判断state字段进行抢占资源,如果获取资源成功,则把当前线程设置为有效工作线程,并且修改state值。其他竞争失败线程,就阻塞进入FIFO队列,等待持有锁线程按顺序唤醒。

        这个原理,不同锁实现会有些区别,具体AQS原理等我们在ReentrantLock,semaphore信号量,FutureTask专文再详细分析。

2.1 AQS Node节点分析

        AQS核心原理说过,AQS只有三个核心变量:head节点、tail节点、int state变量。state已经说过是volatile修饰,多线程入队前竞争锁的共享资源。队列里的Node,我们重点说说。先看源码截图,只看核心几个变量:

        首先看看Node类型字段的有:excusive,share,next,pre,nextWaiter。

exclusive:表示独占锁,只有一个线程可以获得锁。也就是我们在《一文看懂全部锁机制》说过独享锁、排它锁。比如ReentrantLock里面就是独占锁。FIFO里面的每个Node 都是exclusive 节点。

share:共享锁,多个线程可以共享锁。ReentrantReadWriteLock里面的read锁就是共享锁。

pre和 next 就是表示当前Node节点前、后节点引用。 thread: 就是对应线程引用。

waitSatus: 就是当前线程节点等待状态,0就是默认值。它的值有:

          CANCELLED:节点在等待过程被打断或超时,被标记为取消状态。

          SIGNAL:线程等待被唤醒。

          CONDITION:在条件队列中等待。

          PROPAGATE: 释放共享锁时,如果头结点的状态是PROPAGATE状态,就广播我释放锁了,等待锁的线程,都可以去尝试获取锁。

AQS因为不涉及具体实现,简单说这么多,下一篇,我们将分享具体AQS实现的庖丁解牛。比如ReentrantLock,信号量。

标签:Node,JAVA,AQS,队列,编程,线程,原理,节点
From: https://blog.csdn.net/aa5305123/article/details/142103061

相关文章

  • JavaWeb开发01 - HTML+CSS
    浏览器内核对前端代码进行渲染解析,为确保解析效果一直制定web标准。Web标准也称为网页标准,由一系列的标准组成,大部分由W3C(WorldWideWebConsortium,万维网联盟)负责制定。由三个组成部分:HTML:负责网页的结构(页面元素和内容)。CSS:负责网页的表现(页面元素的外观、位置等页面样式......
  • Day06.Java流程控制2
    Java流程控制循环结构While循环while(布尔表达式){//循环内容}最基本的循环只要布尔表达式为true,循环就会一直执行下去我们大多数情况会让循环停止下来,我们需要一个让表达式失效的方式来结束循环少数情况需要循环一直执行,比如服务器的请求响应监听等循环条件一直......
  • Java并发编程 第六章 共享模型之无锁
    1.引子实现1packagecn.itcast.testcopy;importjava.util.ArrayList;importjava.util.List;publicclassTestAccount{publicstaticvoidmain(String[]args){Accountaccount=newUnsafeAccount(10000);Account.demo(account);}......
  • Java并发编程 第七章 共享模型之不可变对象
    1.不可变对象@Slf4j(topic="c.Test1")publicclassTest1{publicstaticvoidmain(String[]args){SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");for(inti=0;i<100;i++){newThread(()-......
  • 基于Java中的SSM框架实现毕业生离校管理系统项目【项目源码+论文说明】
    基于java中的SSM框架实现毕业生离校管理系统演示【内附项目源码+LW说明】课题背景及意义前面介绍到任何行业的改变都在被信息化和科技价值,那么我们此次所介绍的呢,还是基于校园信息化的价值。那么随着校园信息化的不断发展,各种各样的校园信息化软件应运而生,为了满足学生和......
  • JavaWeb案例-登录认证
    在前面的文章中,我们复习了部门管理、员工管理的基本功能。但是我们并没有登录,就直接访问到了Tilias智能辅助系统的后台。这是不安全的,所以今天复习登录认证。最终实现的效果就是用户必须登录之后,才可以访问后台系统中的功能。 1.登录功能 1.1需求在登录界面中,我们可以输......
  • 【pom】解决jar冲突心得 之 通过解决启动报错  Caused by: java.lang.NoClassDefFoun
     解决jar冲突心得之通过解决启动报错 Causedby:java.lang.NoClassDefFoundError:Couldnotinitializeclasscom.fasterxml.jackson.databind.ObjectMapper 学思路 一般情况,出现Causedby:java.lang.NoClassDefFoundError的问题1.要么是jar没有引入pom,所以找不......
  • 基于Java中的SSM框架实现汽车交易系统项目【项目源码+论文说明】计算机毕业设计
    基于java中的SSM框架实现汽车交易系统管理平台演示【内附项目源码+LW说明】摘要电子商务的兴起不仅仅是带来了更多的就业行业。同样也给我们的生活带来了丰富多彩的变化。多姿多彩的世界带来了美好的生活,行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方......
  • JAVA+VUE实现动态表单配置
    功能描述:资产管理系统中,在资产分类中,给同一种类型的资产配置定制化的表单项,并实现不同类型显示不同的数据,如图所示:数据库设计部分:1.表单项表CREATETABLE`dct_smp`.`t_asset_product_definitions`(`id`bigintNOTNULL,`product_id`bigintNOTNULLCOMMENT'......
  • UEFI原理与编程(一)
    第一章UEFI概述(UnifiedExtensibleFirmwareInterface统一的可扩展固件接口)常见缩写及描述:缩略词全名描述UEFIUnifiedExtensibleFirmwareInterface统一的可扩展固件接口BSBootServices启动服务RTRuntimeService运行时服务BIOSBasicInputO......