我们再看一下AQS实际的加锁机制是怎么设计的?是不是跟Synchronized相似?

文章插图
AQS的加锁流程并不复杂,只要理解了同步队列和条件队列,以及它们之间的数据流转,就算彻底理解了AQS 。
- 当多个线程竞争AQS锁时,如果有个线程获取到锁,就把ower线程设置为自己
- 没有竞争到锁的线程,在同步队列中阻塞(同步队列采用双向链表,尾插法) 。
- 持有锁的线程调用await方法,释放锁,追加到条件队列的末尾(条件队列采用单链表,尾插法) 。
- 持有锁的线程调用signal方法,唤醒条件队列的头节点,并转移到同步队列的末尾 。
- 同步队列的头节点优先获取到锁
3. 总结AQS跟Synchronized的加锁流程是一样的,都是通过同步队列和条件队列实现的,阻塞状态的线程被放到同步队列中,等待状态的线程被放到条件队列中,从条件队列唤醒的线程又被转移到同步队列末尾,一块竞争锁 。
看完AQS加锁流程,还没有人不懂AQS的?
下篇文章再讲一下AQS加锁具体的源码实现 。里面有很多精巧的设计,值得我们学习 。
比如:
为什么同步队列要设计成双向链表?而条件队列要设计成单链表?
为什么AQS加锁性能这么好(乐观锁CAS使用)?
同步队列和条件队列中节点怎么用一个对象实现?
释放锁后,怎么唤醒同步队列中线程?
我是「一灯架构」,如果本文对你有帮助,欢迎各位小伙伴点赞、评论和关注,感谢各位老铁,我们下期见

文章插图
【重大发现,AQS加锁机制竟然跟Synchronized有惊人的相似】
经验总结扩展阅读
- 诺如病毒
- 世界上最早被发现的艾滋病
- 详解AQS中的condition源码原理
- 榴莲撬开后发现不熟能合起来吗
- 讽刺自己多余的句子 突然发现自己是多余的说说
- 6 Java多线程:锁与AQS(下)
- 数据科学学习手札146 geopandas中拓扑非法问题的发现、诊断与修复
- 鹅长微服务发现与治理巨作PolarisMesh实践-上
- 开了榴莲发现硬怎么补救
- 心痛但又不能被发现的文案100句 温柔又抑郁的文案中学生