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介绍-根本篇