aqs是多线程同步器,它是JUC包中多个组件的底层实现,比如像Lock、CountDownLatch、Semaphore都用到aqs。从本质来来说,aqs提供了两种锁的机制,分别是排他锁和共享锁。所谓排他锁就是存在多个线程去竞争同一共享资源的时候,同一个时刻,只允许一个线程去访问这样一个共享资源,也就是说多个线程中只能有一个线程去获得这个锁的资源,比如Lock中的ReentrantLock重入锁,它的一个实现就是用到了aqs中一个排他锁的功能;共享锁也称为读锁,就是在同一个时刻允许多个线程同时获得这样一个锁的资源,比如CountDownLatch以及Semaphore都用到aqs中的共享锁的功能,那么aqs作为互斥锁来说,它的整个设计体系中需要解决三个核心的问题,第一个互斥变量的设计,以及如何保证多线程同事更新互斥变量的时候,线程的安全性,第二个,未竞争到锁资源的线程的等待以及竞争到锁的资源释放锁之后的唤醒,第三个锁竞争的公平性和非公平性,aqs采用了一个int类型的互斥变量”state”,用来记录锁竞争的一个状态,0表示当前没有任何线程竞争锁资源,而大于等于1,表示已经有线程正在持有锁资源,一个线程来获取锁资源的时候,首先判断”state”是否等于0,也就说它是无锁状态,如果是,则把这个”state”更新成1,表示占用到锁,而这个过程中,如果多个线程能同时去做这样一个操作,就到导致线程的安全性问题,因此aqs采用CAS机制去保证”state”互斥变量更新的一个原子性,未获得锁的线程,通过Unsafe类中的park方法去进行阻塞,把阻塞的线程按照先进先出的原则,去加入到一个双向链表的一个结构中,当获得锁资源的线程释放锁之后,会从这样一个一个双向链表的头部去唤醒下一个等待的线程,再去竞争锁。最后关于锁竞争的公平性和非公平性的问题,aqs的处理方法是在竞争锁资源的时候,公平锁需要去判断双向链表中是否有阻塞的线程,如果有呢,则需要去排队等待,而非公平锁的处理方式是不管双向链表中是否存在等待竞争锁的线程,它都会去直接尝试更改互斥变量”state”去竞争锁,假设在一个临界点,获得锁的线程释放锁,此时state等于0,而当前的这个线程去抢占锁的时候,正好可以把state修改成1,那么这个时候就表示它也可以拿到锁,而这个过程是非公平的。