当前位置: 首页 > 后端技术 > Java

【Java访谈】请说说AQS是怎么回事?

时间:2023-04-01 15:20:36 Java

大家好,我是Mic。今年的市场环境真的很艰难。对于很多工作一年的人来说,面试难度相当于一个有4年经验的人。越是这样,我们越应该坚强自己,这样才能在逆境中获得更多的机会。今天有一个有一年经验的爱好者被问到“AQS的原理”,来找我求助。来看看大师对这个问题的回答。喜欢我作品的朋友记得点赞收藏关注哦。师父:AQS是J.U.C包中一个非常核心的抽象类。它为多线程访问共享资源提供了一个队列同步器。在J.U.C包中,有很多组件依赖AQS实现线程同步和唤醒,比如Lock、Semaphore、CountDownLatch等。AQS内部由两个核心部分组成:一个由volatile修饰的状态变量,一个由双向链表结构维护的作为竞争条件的FIFO线程等待队列。它的具体工作原理是多个线程修改这个状态共享变量以实现竞争条件,将竞争失败的线程加入FIFO队列并阻塞。抢占竞争资源的线程被释放后,后续线程按照FIFO顺序依次被唤醒。AQS提供了两种资源共享方式,一种是独占资源,同时只有一个线程可以获得竞争资源。比如ReentrantLock就是用这个方法来实现排他锁的。另一个是共享资源。同时,多个线程可以同时获取竞争资源。CountDownLatch或Semaphore使用共享资源同时唤醒多个线程。综上所述,在实际开发中,如果我们需要实现一些特殊的互斥场景,直接使用ReentrantLock有点麻烦,那么我们可以自己集成AQS,自定义多线程竞争的实现逻辑。本题主要考察对Java基础知识的理解。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!