每天一道面试题之-AQS

2023-07-08 17:19:00 浏览数 (1)

前言:

了不起: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 修饰的变量,无法直接访问。这可能会导致实现自定义同步器时的一些限制,例如无法直接在同步器外部访问状态变量。

我是了不起
和我一起学习更多精彩知识!!!

0 人点赞