每天一道面试题之-AQS

简介: 每天一道面试题之-AQS

前言:

了不起:2023年了,计算机这行感觉面试是越来越有难度了,大家也是特别的卷,公司也特别的挑。了不起学弟:是啊,我最近找工作都觉得好南啊,以前随便面面都有offer,现在面试是真的在造宇宙飞船了!了不起:没办法呀,适者生存,你比不过别人,那就只能淘汰了。这样吧,从今天开始每天我们来讨论一道面试题怎么样?积少成多 了不起学弟:好啊!好啊!

正文:

今天的主题:AQS。

简单介绍一下AQS:

AQS 是 Java 中的一个同步机制框架,通过维护一个 state 变量和一个等待队列来实现线程之间的协作和同步。AQS 的设计采用了模板方法模式,具体的同步器只需要实现 tryAcquire、tryRelease 和 isHeldExclusively 三个方法即可。AQS 的实现为 Java 中的同步机制提供了一个灵活且高效的基础框架,也为开发者提供了一种实现自定义同步器的方式。通过上述介绍,我们知道了AQS主要是通过state和一个队列来运作的。

获取同步状态的过程:

如果同步状态可用,那么线程就可以获取到state状态。如果同步状态不可用,则线程将自己加入到等待队列中。当同步状态被释放时,等待队列里面的一个线程就会尝试去获取同步状态,如果没有获取到,该线程会被重新加入到等待队列中。通俗解释:假设我们有一个vip座位。这个座位很多人都想要,那当这个vip座位没人坐的时候,随便一个人来了就可以坐(tryAcquire )上去。vip座位上有人,那么后面来的人就得排队。直到有座的人离开(tryRelease ),再从队伍里的一个人坐上去。正在排队的人,可以看看(isHeldExclusively)座位上有没有人。同时我们还要知道AQS的等待队列是支持公平和非公平的,假设我们再new一个reentrantlock的时候,如果没有传参数那就是非公平,传true那就是公平。AQS默认非公平,因为这样性能会高一点。简单理解:非公平就是座位一旦空了,所有人直接上去抢。公平就是一个个排队。各有各的好处和坏处。

为什么要用AQS?:

同步机制的主要作用是保证多个线程之间的协作和同步,避免出现数据竞争、死锁等问题。AQS 提供了一个灵活且高效的同步机制框架,它的主要优势包括:

1.支持独占锁和共享锁 AQS 支持独占锁和共享锁两种同步方式,可以满足不同的同步需求。独占锁是指在一个共享资源只能被一个线程获取。共享锁就是这个共享资源可以被多个线程同时持有。拿我们刚刚vip座位举例子:独占锁只能有一个人坐这个位置,共享锁就是可以多个人坐一个位置。

2.支持多个条件变量 AQS 还支持多个条件变量,可以实现更加复杂的同步逻辑。条件变量是指基于锁的等待和通知机制,可以让线程在等待某个条件满足时进入等待状态,当条件满足时被通知唤醒。这个简单理解就是说:爱心vip座位是给老幼病残坐的,我们给乘客得加上一个条件变量,符合才能够去坐。3.可以实现自定义同步器 AQS 提供了一个模板方法模式的框架,可以让开发者实现自定义的同步器。通过实现 tryAcquire、tryRelease 和 isHeldExclusively 三个方法,可以针对不同的同步需求实现不同的同步器。

4.高效且可扩展 AQS 的实现是基于一个等待队列和一个 state 变量,可以高效地实现线程之间的协作和同步。同时,AQS 也提供了一些辅助方法,例如 acquireInterruptibly、tryAcquireNanos 等,可以实现更加复杂的同步逻辑。

AQS有没有什么缺点或者坑?:

1.难以调试 由于 AQS 的实现比较复杂,因此在使用过程中出现问题的时候,调试起来可能比较困难。特别是在使用自定义同步器的时候,需要仔细检查实现细节,避免出现死锁、饥饿等问题。

2.性能问题 虽然 AQS 的实现基于快速的等待队列和轻量级的线程阻塞机制,但是在极端情况下,AQS 的性能可能会受到影响。例如,当等待队列中的线程数量非常大时,AQS 可能会出现线程饥饿的问题,导致性能下降。

3.条件变量实现限制 AQS 的条件变量实现有一些限制,例如只支持等待队列中的节点唤醒,不支持选择性通知等。这些限制可能会影响一些复杂的同步逻辑的实现。

4.状态变量不可访问 AQS 中的状态变量 state 是一个 protected 修饰的变量,无法直接访问。这可能会导致实现自定义同步器时的一些限制,例如无法直接在同步器外部访问状态变量。

相关文章
|
4月前
|
Java
【多线程面试题二十五】、说说你对AQS的理解
这篇文章阐述了对Java中的AbstractQueuedSynchronizer(AQS)的理解,AQS是一个用于构建锁和其他同步组件的框架,它通过维护同步状态和FIFO等待队列,以及线程的阻塞与唤醒机制,来实现同步器的高效管理,并且可以通过实现特定的方法来自定义同步组件的行为。
【多线程面试题二十五】、说说你对AQS的理解
|
7月前
|
安全 Java
美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了
【5月更文挑战第2天】美团一面,面试官让介绍AQS原理并手写一个同步器,直接凉了
93 6
|
7月前
|
设计模式 存储 Java
【面试问题】什么是 AQS ?
【1月更文挑战第27天】【面试问题】什么是 AQS ?
|
Java 调度 数据库
面试官:谈一谈java中基于AQS的并发锁原理
面试官:谈一谈java中基于AQS的并发锁原理
112 0
面试官:谈一谈java中基于AQS的并发锁原理
|
Java 程序员
面试被问AQS、ReentrantLock答不出来?这些知识点让我和面试官聊了半小时!
Java并发编程的核心在于java.concurrent.util包,juc中大多数同步器的实现都围绕了一个公共的行为,比如等待队列、条件队列、独占获取、共享获取等,这个行为的抽象就是基于AbstractQueuedSynchronized(AQS)。AQS定义了多线程访问共享资源的同步器框架。
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
73 4

热门文章

最新文章