Java的AQS基本原理详细分析

 更新时间:2024年01月11日 09:03:56   作者:智由静生  
这篇文章主要介绍了Java的AQS基本原理详细分析,AQS是Abstract Queued Synchronizer的简称,AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,本文主要讲解分析其基本原理,需要的朋友可以参考下

AQS基本原理

AQS是Abstract Queued Synchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架。

从使用层面来说,AQS的功能分为两种:独占和共享。

  • 独占锁,每次只能有一个线程持有锁,比如前面给大家演示的ReentrantLock就是以独占方式实现的互斥锁;
  • 共享锁,允许多个线程同时获取锁,并发访问共享资源,比如ReentrantReadWriteLock。

AQS内部有以下几个重要的数据结构:

  • state变量,记录锁定状态,默认0
  • 加锁线程变量,记录当前持有锁的是哪个线程,默认null
  • 线程等待队列

以ReentrantLock为例,加锁代码如下:

ReentrantLock lock = new ReentrantLock();
lock.lock();
//------业务逻辑-------
.......
//--------------------------
lock.unlock();

例如线程1和线程2进行加锁操作,线程1先获得锁,AQS会将state置为1,并且加锁线程变量记录为线程1。线程2由于没有获得锁,会被AQS放到线程等待队列中进行等待。

ReentrantLock翻译成中文是可重入锁,从名字就可知它和synchronized关键字一样是可重入的。因为有一个加锁线程变量当前记录了持有锁的是哪个线程,ReentrantLock再次加锁时,是可以成功的,相应的state变量也会加1。和synchronized关键字一样,有一次加锁操作就必须对应一次解锁操作,解锁一次,state变量会减1。

当线程1执行完成,所有锁定操作都对应执行了解锁操作后,state变量为0,并且加锁线程变量被置为null。此时会唤醒线程等待队列中的第一个线程(线程2)去尝试获得锁了。

但是如果此时恰好有一个新的线程3抢在线程2之前获得了锁,那么线程2只能继续等待,这很不公平呀!而ReentrantLock默认的就是不公平锁。如果希望获得的是公平锁,新来的线程必须在线程等待队列中排队等待,也很简单,只需要构造ReentrantLock对象时,指定true的参数即可。

ReentrantLock lock = new ReentrantLock(true);

到此这篇关于Java的AQS基本原理详细分析的文章就介绍到这了,更多相关AQS基本原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java之抽象类和继承抽象类解读

    java之抽象类和继承抽象类解读

    这篇文章主要介绍了java之抽象类和继承抽象类,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • @GrpcServise 注解的作用和使用示例详解

    @GrpcServise 注解的作用和使用示例详解

    @GrpcService 是一个 Spring Boot 处理器,它会查找实现了 grpc::BindableService 接口的类,并将其包装成一个 Spring Bean 对象,这篇文章主要介绍了@GrpcServise 注解的作用和使用,需要的朋友可以参考下
    2023-05-05
  • Mybatis-Plus根据时间段去查询数据的实现示例

    Mybatis-Plus根据时间段去查询数据的实现示例

    这篇文章主要介绍了Mybatis-Plus根据时间段去查询数据的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 教你怎么用SpringBoot整合Swagger作为API

    教你怎么用SpringBoot整合Swagger作为API

    这篇文章主要介绍了教你怎么用SpringBoot整合Swagger作为API,文中有非常详细的代码示例,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • Java中反射机制和作用详解

    Java中反射机制和作用详解

    这篇文章主要给大家介绍了关于Java中反射机制和作用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • Mybatis集成到Spring容器的详细步骤

    Mybatis集成到Spring容器的详细步骤

    在现在的JavaEE开发过程中,我们经常会使用到Spring+SpringMVC+Mybatis这个组合,那么Mybatis是如何集成到Spring中的呢,下面通过实例代码给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • VSCode新手教程之配置Java环境的详细教程

    VSCode新手教程之配置Java环境的详细教程

    这篇文章主要给大家介绍了关于VSCode新手教程之配置Java环境的详细教程,工欲善其事必先利其器,想要工作顺利我们先搭建好JAVA的开发环境,需要的朋友可以参考下
    2023-10-10
  • 使用java实现日志工具类分享

    使用java实现日志工具类分享

    这篇文章主要介绍的Java代码工具类是用于书写日志信息到指定的文件,并且具有删除之前日志文件的功能,需要的朋友可以参考下
    2014-03-03
  • java为什么使用BlockingQueue解决竞态条件问题面试精讲

    java为什么使用BlockingQueue解决竞态条件问题面试精讲

    这篇文章主要为大家介绍了java为什么使用BlockingQueue解决竞态条件问题面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java全面细致讲解类与对象

    Java全面细致讲解类与对象

    类和对象是两种以计算机为载体的计算机语言的合称。对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型;变量就是可以变化的量,存储在内存中—个可以拥有在某个范围内的可变存储区域
    2022-05-05

最新评论