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