并发编程面试题2

一、AQS高频问题:

1.1 AQS是什么?

AQS是一个抽象队列同步器(Abstract Queued Synchronizer),本质是一个抽象类。

AQS中有一个核心属性state,其次还有一个双向链表以及一个单向链表。

  • state是基于volatile修饰,再基于CAS修改,同时可以保证三大特性(原子性、可见性、有序性)。
  • 双向链表由Node对象组成。
  • Condition内部类中提供了一个由Node对象组成的单向链表。

AQS是JUC下大量工具的基础类,很多工具都基于AQS实现,比如Lock锁、CountDownLatch、Semaphore、线程池等等。

state是啥:state是一个int类型的数值,表示同步状态,具体状态由子类实现。

condition和单向链表是啥:sync提供了wait方法和notify方法,Lock锁也需要实现这种机制,Lock锁基于AQS内部的Condition实现了await和signal方法(对标sync的wait和notify)。

sync在线程持有锁时,执行wait方法,会将线程扔到WaitSet等待池中排队,等待唤醒;Lock在线程持有锁时,执行await方法,会将线程封装为Node对象,扔到Condition单向链表中,等待唤醒。

Condition在做了什么:将持有锁的线程封装为Node扔到Condition单向链表,同时挂起线程。如果线程唤醒了,就将Condition中的Node扔到AQS的双向链表等待获取锁。

1.2 唤醒线程时,AQS为什么从后往前遍历?

如果线程没有获取到资源,就需要将线程封装为Node对象,安排到AQS的双向链表中排队,并且可能会挂起线程。

在唤醒线程时,head节点的next是第一个要被唤醒的。如果head的next节点取消了,AQS的逻辑是从tail节点往前遍历,找到离head最近的有效节点。

为了理解这个问题,需要了解一个Node对象是如何添加到双向链表中的。基于addWaiter方法,先将当前Node的prev指向tail节点,再将tail指向当前节点,再让prev节点指向当前节点。如下图所示,如果只执行到第二步,Node加入到AQS队列中,但从prev节点往后找不到当前节点。

image.png

1.3 AQS为什么用双向链表?

因为AQS中存在取消节点的操作,节点被取消后,需要从AQS的双向链表中断开连接并保证链表的完整性:

  • 需要将prev节点的next指针指向next节点。
  • 需要将next节点的prev指针指向prev节点。

如果是单向链表,需要遍历整个链表才能完成上述操作,浪费资源。

1.4 AQS为什么要有一个虚拟的head节点?

有一个哨兵节点更方便操作。另一个原因是AQS内部每个Node都有一些状态,这些状态不仅针对自己,还针对后续节点:

  • 1:当前节点取消。
  • 0:默认状态。
  • -1:当前节点的后继节点挂起。
  • -2:当前节点在Condition队列中(await将线程挂起)。
  • -3:当前是共享锁,唤醒时后续节点依

相关推荐

  1. 面试宝藏】Go并发编程面试

    2024-07-09 22:02:01       25 阅读
  2. 真实并发编程问题-1.钉钉面试

    2024-07-09 22:02:01       49 阅读
  3. 并发面试汇总

    2024-07-09 22:02:01       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 22:02:01       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 22:02:01       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 22:02:01       42 阅读
  4. Python语言-面向对象

    2024-07-09 22:02:01       53 阅读

热门阅读

  1. 【Tools】了解人工通用智能 (AGI):未来的智能体

    2024-07-09 22:02:01       21 阅读
  2. HTML最快速最简单

    2024-07-09 22:02:01       21 阅读
  3. 等保测评推动黑龙江数字化转型中的安全保障

    2024-07-09 22:02:01       19 阅读
  4. 嵌入式硬件电路常用设计软件

    2024-07-09 22:02:01       24 阅读
  5. [终端安全]-2 移动终端之硬件安全(SE)

    2024-07-09 22:02:01       18 阅读
  6. Kafka 典型问题与排查以及相关优化

    2024-07-09 22:02:01       19 阅读