• 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();
      }
     }

     

  • 相关阅读:
    day 16
    day 15
    day 14
    day 13
    Unity Shader UnityCG.cginc
    Unity Shader 包含内置文件
    Unity Shader 如何使用属性
    Unity Shader 顶点/片元着色器的基本结构
    Unity Shader 的基础结构
    git文件名大小敏感
  • 原文地址:https://www.cnblogs.com/YXBLOGXYY/p/16049102.html
Copyright © 2020-2023  润新知