Lock和Condition(下):Dubbo如何用管程实现异步转同步?
1)Lock 和 Condition 实现的管程在方法的调用上和sychronized有什么不同?
-
前者用await(), signal(),signalAll()。后者使用wait,notify(),notifiAll();
2)本节我们要探究dubbo异步转同步,那什么是异步什么是同步呢?
-
你去给23班女生送情书
-
送完在班级门口站着等回复--同步
-
送完扭头就走,不在乎结果--异步
-
-
要结果的就是同步,不要结果的就是异步。
3)如果我要让我的程序支持异步,应该怎样设计?
-
调用方找个小弟去调用,方法方直接return返回 ,让小弟去做实际的事。这个小弟就是 子线程。
4)现在很多 通信协议都是异步的,比如我们的TCP协议是异步的,也就是你发完消息之后,线程是不会等待 响应结果的,但是实际 工作的时候,我们发完消息,是能够得到结果的,这是因为dubbo帮我们把异步转为 同步了,那么dubbo是怎样做到的呢?
-
通过一个类 叫 DefaultFuture
5)这个类内部是怎样的?
-
一个锁和一个条件变量,根据管程的等待-通知机制去完成异步转同步
// 创建锁与条件变量
private final Lock lock
= new ReentrantLock();
private final Condition done
= lock.newCondition();
// 调用方通过该方法等待结果
Object get(int timeout){
long start = System.nanoTime();
lock.lock();
try {
while (!isDone()) {
done.await(timeout);
long cur=System.nanoTime();
if (isDone() ||
cur-start > timeout){
break;
}
}
} finally {
lock.unlock();
}
if (!isDone()) {
throw new TimeoutException();
}
return returnFromResponse();
}
// RPC结果是否已经返回
boolean isDone() {
return response != null;
}
// RPC结果返回时调用该方法
private void doReceived(Response res) {
lock.lock();
try {
response = res;
if (done != null) {
done.signal();
}
} finally {
lock.unlock();
}
}
posted on 2022-03-24 11:52 Love&Share 阅读(362) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~