十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java中关于AQS的常见面试题

Java中关于AQS的常见面试题 1、什么是AQS作用是什么AQSAbstractQueuedSynchronizer是 Java 并发包java.util.concurrent.locks里的一个抽象同步框架。本身不是锁采用模板方法模式把线程排队、阻塞唤醒、状态管理这些通用并发逻辑封装好子类只需要实现少量抽象方法就能快速实现阻塞锁如 ReentrantLock、ReentrantReadWriteLock、同步器如CountDownLatch、Semaphore你只管管“状态”AQS 帮你管“排队”2、AQS的组成包含哪些内容state 同步状态volatile int state核心标记。state 的含义由子类自定义比如独占锁中 0 代表无锁0 代表锁被占用读写锁用 state 高低位分别记录读锁、写锁计数。FIFO 双向 CLH 等待队列存放抢锁失败的线程每个节点Node封装线程、等待状态竞争失败线程入队等待被唤醒。模板抽象方法tryAcquire/tryRelease独占、tryAcquireShared/tryReleaseShared共享交给子类重写。3、AQS独占锁的获取流程初始同步状态state0代表同步资源空闲。线程发起独占锁获取操作调用acquire()内部调用子类实现的tryAcquire()尝试获取同步状态判断state是否等于 0。如果state 0通过 CAS 把state修改为 1代表获取锁成功执行后续业务逻辑。如果state ! 0获取锁失败将当前线程封装成Node节点加入 CLH 双向等待队列线程进入阻塞。队列内被阻塞的线程会执行acquireQueued()自旋循环反复尝试获取同步状态如果自己的前驱节点是 head 头节点就再次尝试抢锁抢锁依旧失败则继续 park 阻塞。持有锁的线程释放锁后唤醒队列里的后继阻塞线程被唤醒的线程回到自旋逻辑继续尝试抢锁。线程成功获取锁后设置当前线程为锁持有者结束获取流程。简单记尝试抢锁→失败入队→自旋 阻塞等待→被唤醒继续抢锁。4、共享模式和独占模式有什么区别模式独占模式共享模式资源占用同一时刻只允许一个线程获取锁允许多个线程同时获取资源核心方法tryAcquire()、tryRelease()tryAcquireShared()、tryReleaseShared()代表实现ReentrantLockSemaphore、CountDownLatch、读锁唤醒逻辑释放时只唤醒一个后继线程释放后会传播唤醒多个等待线程5、AQS的公平锁和非公平锁有什么区别公平锁线程抢锁前先看等待队列有无排队线程。有就入队按照 FIFO 顺序获取锁不允许插队。非公平锁ReentrantLock 默认线程直接尝试抢占 state不管队列有没有等待线程抢不到才进入队列排队。允许插队吞吐量高但可能线程饥饿。总结公平锁重排队顺序非公平锁重性能吞吐量。
返回列表