AQS的加锁流程并不复杂,只要理解了同步队列和条件队列,以及它们之间的数据流转,就算彻底理解了AQS。
1.当多个线程竞争AQS锁时,如果有个线程获取到锁,就把ower线程设置为自己
2.没有竞争到锁的线程,在同步队列中阻塞(同步队列采用双向链表,尾插法)。
3.持有锁的线程调用await方法,释放锁,追加到条件队列的末尾(条件队列采用单链表,尾插法)。
4.持有锁的线程调用signal方法,唤醒条件队列的头节点,并转移到同步队列的末尾。
5.同步队列的头节点优先获取到锁
如图:
AQS的加锁流程并不复杂,只要理解了同步队列和条件队列,以及它们之间的数据流转,就算彻底理解了AQS。
1.当多个线程竞争AQS锁时,如果有个线程获取到锁,就把ower线程设置为自己
2.没有竞争到锁的线程,在同步队列中阻塞(同步队列采用双向链表,尾插法)。
3.持有锁的线程调用await方法,释放锁,追加到条件队列的末尾(条件队列采用单链表,尾插法)。
4.持有锁的线程调用signal方法,唤醒条件队列的头节点,并转移到同步队列的末尾。
5.同步队列的头节点优先获取到锁
如图: