AQS-->Abstract Queue Synchronized
只要包含三个变量 :
1,state
2,加锁线程(thread)
3,等待队列
线程1释放锁
将state设置为0,加锁线程设置为null,同时回去唤醒等待队列头位置线程
AQS默认是非公平锁
线程1释放锁的同时,会去唤醒线程2,但是同时新来一个线程3,也去竞争这个锁,加锁成功的话,线程2还是会在等待队列进行等待
公平锁
ReetrantLock lock = new ReentractLock(true);
如果是公平锁,线程3,会去判断等待队列里是否有等待的线程,如果存在的话,就会插入到队列尾部等待