ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

聊聊你对AQS的理解

2021-03-03 07:32:57  阅读:232  来源: 互联网

标签:加锁 AQS lock ReentrantLock state 理解 线程 聊聊


  场景引入

    面试官上来就一句,谈谈你对AQS的理解,大家心里可能收到了1W点伤害,AQS是什么,可能连全称都不知道,所以下面让我们聊聊AQS。  

  以ReentrantLock来介绍一下AQS

    在java中,用java并发包下的ReentrantLock来加锁和释放锁,是个什么样的感觉呢?

 ReentrantLock  lock=new ReentrantLock();
        lock.lock();
        try { 
            
        }catch (Exception ex){
            
        }
        finally {
            lock.unlock();
            System.out.println("测试");
        }

    上面那段代码,无非就是一个锁的对象,然后加锁和释放锁。

    你可能会问:这个和AQS有啥关系,关系大了去了,因为Java 并发包下,很多API都是基于AQS来实现加锁和释放锁的功能的,AQS是Java 并发包的基础。

    AQS的全称是:AbstractQueuedSynchronizer,抽象队列同步器,给大家画一张图,看看,ReentrantLock和AQS的之间的关系。

    

 

     ReentrantLock里面包含了一个AQS对象,这个AQS对象是ReentrantLock可以实现加锁和释放锁的关键性核心组件。

  ReentrantLock加锁和释放锁的底层原理

    如果一个线程尝试用ReentrantLock的lock方法来进行加锁,会发生什么事情呢?

    这个AQS对象内部有一个核心变量叫做state,是int类型的并且还是volatile的,初始状态这个state的值是0。

    另外AQS内部还有一个关键变量,用来记录当前加锁的是哪个线程,初始荒唐下这个变量是null。

    

 

    接着线程1跑过来调用ReentrantLock的lock方法进行加锁,这个加锁的过程,直接就是将CAS的state从0变成1。

    如果之前没加过锁,那么state值是0,此时线程1是可以加锁成功的。

    一旦线程1,加锁成功之后,就把当前加锁线程设置为自己。下面这张图就是线程1的加锁过程。

    其实看到这里,大家对AQS应是有感觉了的,就是并发包里面的一个核心组件,里面维护有state变量,加锁线程变量等核心东西,维护了加锁状态。

    ReentrantLock这种东西只是也给外层的API,内核中的锁机制都是依赖AQS组件的。

    除此之外,AQS内部还维护着一个先进先出的等待队列,因为如果线程2这个时候来加锁,就会加锁失败,所以AQS还有维护一个等待队列,专门来存放那些加锁失败的线程。

    ReentrantLock是可重入锁,知道了state变量和当前加锁线程是谁之后,就可以很容易实现可重复进入的锁了。

    如果线程1,在完成自己的业务逻辑代码之后,就会释放锁,他释放锁的过程非常简单,就是将AQS内的State变量的值递减1,如果state值为0,就彻底释放锁了,会将加锁线程也变为null。

    这就是AQS的整个过程。

  总结

    AQS是一个并发包的基础组件,用来实现各种锁,各种同步组件,它包含state变量,加锁线程,等待队列等并发中的核心组件。

    

 

 

 

      

                

标签:加锁,AQS,lock,ReentrantLock,state,理解,线程,聊聊
来源: https://www.cnblogs.com/gdouzz/p/14472372.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有