关于aqs:AQS基本原理17问

36次阅读

共计 1990 个字符,预计需要花费 5 分钟才能阅读完成。

1、AQS 是如何实现锁的?

AQS 通过定义了一个 State 变量来示意同步状态,同时保护了一个期待队列,当一个线程获取锁失败时,会将该线程退出到期待队列中,并将其阻塞,当锁的状态产生扭转时,AQS 会从期待队列中抉择一个线程唤醒,使其有机会获取锁。

2、AQS 的外围办法是哪些?

AQS 的外围办法包含 tryAcquire(int)、tryRelease(int)、tryAcquireShared(int)、tryReleaseShared(int)、isHeldExclusively() 等。

3、如何应用 AQS 实现独占锁?

能够通过继承 AbstractQueuedSynchronizer 类并实现 tryAcquire(int) 和 tryRelease(int) 办法来实现独占锁。

4、如何应用 AQS 实现共享锁?

能够通过继承 AbstractQueuedSynchronizer 类并实现 tryAcquireShared(int) 和 tryReleaseShared(int) 办法来实现共享锁。

5、AQS 是如何实现同步的?

AQS 应用了一种基于 FIFO 期待队列的机制,当一个线程获取锁失败时,会将该线程退出到期待队列中,并将其阻塞,当锁的状态产生扭转时,AQS 会从期待队列中抉择一个线程唤醒,使其有机会获取锁。

6、AQS 中的 State 变量有什么作用?

AQS 中的 State 变量用于示意同步状态,能够用一个整型数值示意同步状态的不同状况,比方独占锁和共享锁的状态。

7、AQS 中的 Node 节点有什么作用?

AQS 中的 Node 节点用于示意期待队列中的一个节点,其中蕴含了前驱节点、后继节点、期待状态等信息,AQS 会依据这些信息进行线程的唤醒和期待。

8、AQS 的期待队列是如何实现的?

AQS 的期待队列是通过一个双向链表来实现的,每个节点都蕴含了前驱节点和后继节点的信息,当一个线程退出期待队列时,会将一个节点退出到队列尾部,当一个线程被唤醒时,会从队列头部抉择一个节点进行唤醒。

9、AQS 的 tryAcquire 办法和 tryRelease 办法的实现原理是什么?

tryAcquire 办法和 tryRelease 办法都是基于 CAS(Compare and Swap,比拟并替换)操作实现的,通过原子操作批改 State 变量的值,以实现对锁的获取和开释。

10、AQS 中的 Condition 对象是如何实现的?

AQS 中的 Condition 对象是基于期待队列的机制实现的,每个 Condition 对象都有一个期待队列,当一个线程调用 Condition 的 await 办法时,会将该线程退出到 Condition 的期待队列中,并开释锁,当另一个线程调用 Condition 的 signal 办法时,会从期待队列中抉择一个节点唤醒,并将其退出到主期待队列中,使其有机会获取锁。

11、AQS 如何实现可重入锁?

AQS 实现可重入锁的形式是通过记录持有锁的线程和持有次数,在每次获取锁时判断以后线程是否曾经持有锁,如果是,则间接减少持有次数,如果不是,则通过失常的获取锁流程来获取锁。

12、AQS 如何实现偏心锁?

AQS 实现偏心锁的形式是通过保护一个期待队列,所有期待锁的线程都会被退出到该队列的尾部,当锁开释时,AQS 会从期待队列的头部抉择一个线程进行唤醒,保障先期待的线程先获取锁,实现公平性。

13、AQS 如何实现读写锁?

AQS 实现读写锁的形式是通过保护两个 State 变量,一个示意读锁的数量,一个示意写锁的数量,在获取读锁和写锁时都须要判断以后状态是否容许获取锁,以及期待队列中是否有期待线程,从而实现读写锁的性能。

14、AQS 如何实现信号量?

AQS 实现信号量的形式是通过保护一个 State 变量,示意以后可用的许可证数量,以及一个期待队列,当一个线程须要获取许可证时,如果以后可用的许可证数量大于 0,则间接获取许可证,否则退出期待队列中期待,当有其余线程开释许可证时,AQS 会从期待队列中抉择一个线程唤醒,并使其获取许可证。

15、AQS 如何实现可中断锁?

AQS 实现可中断锁的形式是通过在期待队列中为每个线程都保护一个标识位,示意该线程是否被中断,当一个线程期待锁时,如果被中断,则 AQS 会将该线程从期待队列中移除,并抛出 InterruptedException 异样,使该线程可能退出期待状态。

16、AQS 如何实现自旋锁?

AQS 实现自旋锁的形式是通过 CAS 操作来实现,当一个线程获取锁失败时,会尝试屡次通过 CAS 操作来获取锁,直到获取锁胜利或者达到肯定的次数后才进入期待队列。这种形式能够防止线程的上下文切换和期待队列的开销

17、AQS 如何保障并发平安?

AQS 通过保护一个状态变量和一个期待队列来实现锁的管制,所有对共享资源的拜访都须要通过获取锁来进行,从而保障同一时刻只有一个线程可能访问共享资源,防止了多线程竞争的状况,保障了并发平安。


一、AQS 介绍 - 根本篇

正文完
 0