我们从Condition对象的创建开始:
Condition对象是通过ReentrantLock对象的newCondition()方法来创建的:
下面就来看看ConditionObject类的源码:
下来主要看有关通信的三个方法await()、signal()、signalAll()方法,其他方法调用的时候再看;
总结一下就是:
1、await的过程如下:
①将当前线程加入等待队列(等待队列不能获取锁,同步队列才有这个资格);
②调用await方法的线程释放锁;
③自旋(while)挂起,直到被唤醒或者超时或者线程中断等
④(被唤醒的时候就已经通过signal/signalAll加入到同步队列里面了,已经可以获取锁了)获取锁,更新等待队列;
2、signal的过程如下:
①先判断当前线程有没有锁,如果当前线程没有锁,抛出异常(自己没有锁,就没资格叫醒别人来拿锁);
②拿到等待队列的头节点;
③循环操作,将等待队列里的节点依次加入同步队列里面去获取锁(该过程还在不断的更新等待队列的头、尾结点的指针,因为将节点从等待队列加入到同步队列,它的状态就改变了,不应该继续留在等待队列中),直至等待队列里面某一个节点对应的线程拿到了锁才退出循环;
3、signalAll的过程如下:
①先判断当前线程有没有锁,如果当前线程没有锁,抛出异常(自己没有锁,就没资格叫醒别人来拿锁);
②拿到等待队列的头节点;
③将等待队列中的所有节点全部加入到同步队列中让他们去获取锁;