公平锁指的就是: 在竞争环境下,先到临界区的线程比后到的线程一定更快地获取得到锁
那非公平就很好理解了: 先到临界区的线程未必比厚道的线程更快地获取得到锁
如何实现公平锁和非公平锁?
公平锁可以把竞争的线程放在一个先进先出的队列上,只要持有锁的线程执行完了,唤醒队列的下一个线程去获取锁就好了
非公平锁的概念上面就已经提到了: 后到的线程可能比前到临界区的线程获取得到锁,那实现也很简单,线程下尝试能不能够获取得到锁,如果获取得到锁了就执行同步代码
如果获取不到锁,那就再把这个线程放到队列呗
所以非常公平锁和非公平的区别就是: 线程执行同步代码块是,是否会去尝试获取锁,如果会尝试获取锁,那就是非公平锁,如果不会尝试获取锁,直接进队列,再等待唤醒,那就是公平的
synchronize的锁是非公平锁
那什么是AQS?
AQS全称是abstractQueuedSynchronizer,是可以给我们实现锁的一个框架,内部实现的关键是维护了一个先进先出的队列以及state状态变量。先进先出队列存储的载体叫做Node 节点,该节点标识着当前的状态值,是独占还是共享模式以及它的前驱和后继节点等等信息
简单理解:AQS 定义了模板,具体实现了由各个子类完成。总体的流程可以总结为: 会把需要等待的线程以Node 的形式放到这个先进先出的队列上,state 变量则表示当前锁的状态
AQS 支持两种模式: 独占(锁只会被一个线程独占 )和共享(多个线程可同时执行)