AQS-等待队列中的节点是怎么加入到对同步状态获取的竞争中的
关键代码如下:
第一个红框的代码会阻塞当前线程,第二个红框的代码会把节点加入到获取同步状态的竞争中。
这里的isOnSyncQueue(node)方法主要的作用就是判断节点是否在同步队列中,如果不在,返回fasle,就会在while循环中调用LockSupport.park(this)阻塞住当前线程,那线程什么时候会被唤醒,当然是当有持有锁的线程调用了signal()方法且该节点处于等待队列的首节点时,就会被唤醒,关键代码如下:
第一个红框代码作用是把节点加入到同步队列,第二个红框代码作用是把节点对应线程唤醒。
而因为节点对应线程被唤醒,同时节点也被加入到同步队列了,那么isOnSyncQueue(node)结果就会返回true,就会跳出while循环,然后执行acquireQueued()方法,该方法的主要作用就是把节点加入到对同步状态获取的竞争中。
等待队列中的节点是怎么加入到对同步状态获取的竞争中的流程图: