Java 语言内置的管程里只有一个条件变量,而 Lock&Condition 实现的管程是支持多个条件变量的,这是二者的一个重要区别。

1、Lock 和 Condition 实现的管程,条件变量支持多个,

条件变量就是线程是否能执行
synchronized只支持一个 就是等待队列是否为空
实现阻塞队列就需要多个条件变量

队列不满,队列不空

2、Lock 和 Condition 实现的管程,线程等待和通知需要调用和synchronized不一样

Lock 和 Condition 实现的管程,线程等待和通知需要调用 await()、signal()、signalAll(),它们的语义和 wait()、notify()、notifyAll() 是相同的。但是不一样的是,Lock&Condition 实现的管程里只能使用前面的 await()、signal()、signalAll(),而后面的 wait()、notify()、notifyAll() 只有在 synchronized 实现的管程里才能使用。如果一不小心在 Lock&Condition 实现的管程里调用了 wait()、notify()、notifyAll(),那程序可就彻底玩儿完了。


3、dubbo异步转同步

感觉很类似于jdk中的Future模式,在get的时候阻塞

课后思考

DefaultFuture 里面唤醒等待的线程,用的是 signal(),而不是 signalAll(),你来分析一下,这样做是否合理呢?

答案

不合理 新版本已经使用了all

image.png