Java面试题

题目

讲讲你对 AQS 的理解

答案

AQS 的全称 AbstractQueuedSynchronizer。它的底层核心是 CAS。它是可重入锁,分为公平锁和非公平锁。全局定义了一个 volitale 类型的 state。当前线程获取到锁的时候 state 加 1,释放锁的时候 state -1。当 state 为 0 的时候,表示没有线程获取到锁。

当前线程获取锁的时候会先判断当前的 state 的值是否是 0 ,如果是 0 ,使用 CAS 判断来加锁。如果当前的 state 的值不为 0 ,就用当前的线程和已经获取到的锁的线程比较,如果是当前线程就将 state 值加 1 。如果当前线程不是获取到锁的线程。这边分为公平锁和非公平锁。如果是公平锁,就直接将当前线程获取锁的信息存放到线程中,如果是非公平锁,就将当前线程获取锁,如果能够获取锁就获取,如果获取不到,就将当前线程放到队列中。AQS 里面无论是公平锁还是非公平锁,只要信息进入到队列中,就都是公平的。都是从头获取锁。