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   Love&Share  阅读(362)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示