为什么AQS中Node节点的线程状态保存在上一个节点中?

/ 默认分类 / 0 条评论 / 1856浏览

为什么AQS中Node节点的线程状态保存在上一个节点中?

在介绍AQS的文章中,我画了这样一张图片

我们知道,AQS中的同步阻塞队列当前节点的状态信息保存在其前驱节点中,但是为什么要这样设计呢?

完全可以这样: 当前节点的状态就保存在本节点中,在head节点获取锁成功后,唤醒后面的节点。并且设置同步阻塞队列的head为下一个节点. 这种方式的确可以,但是如果在同步阻塞队列中只有一个节点,后者初始化后第一次进入一个节点,这个时候需要同时保证head和tail的cas设置。 相反,如果按照目前AQS中过的设计,head节点只是一个逻辑节点,不包含线程相关信息,只决定真正意义上的下一个节点的状态,那么每次入队的时候 只需要CAS设置tail即可,因为head对我们来说没有意义,比如初始化时,head其实是一个new Node(),一个空对象。

ps:以上为个人观点,有不同看法的大佬欢迎下方留言讨论哦