首页 > 其他分享 >Lock和Condition(下):Dubbo如何用管程实现异步转同步?

Lock和Condition(下):Dubbo如何用管程实现异步转同步?

时间:2022-09-28 11:02:27浏览次数:51  
标签:Dubbo 同步 异步 lock 管程 调用 done Lock isDone

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

 

标签:Dubbo,同步,异步,lock,管程,调用,done,Lock,isDone
From: https://blog.51cto.com/u_15810109/5718752

相关文章

  • dubbo泛化调用
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>......
  • HMdubbo1.1【分布式系统中的相关概念】
    1大型互联网项目架构目标1.1传统项目与互联网项目1.2互联网项目特点用户多流量大,并发高海量数据易受攻击功能繁琐变更快1.3衡量网站的性能指......
  • ASP.NET Core GRPC 和 Dubbo 互通
    一.前言Dubbo是比较流行的服务治理框架,国内不少大厂都在使用。以前的Dubbo使用的是私有协议,采集用的hessian序列化,对于多语言生态来说是极度的不友好。现在Dubbo发......
  • dubbo负载均衡
    随机负载均衡publicclassRandomLoadBalanceextendsAbstractLoadBalance{privatefinalRandomrandom=newRandom();protected<T>Invoker<T>doSele......
  • Day 12 synchronized和Lock的学习
    Day12多线程学习同步方法及同步块方法锁synchronized可以保证线程的同步。形成原理就是队列和锁在方法前加synchronized关键字这个方法就是同步方法,没有加就不安全。......
  • 浏览器报错:..from origin ‘null‘ has been blocked by CORS policy Cross origin re
    跨源资源请求问题解决方案问题描述:当我们在vsCode中使用 openinbrower插件打开html文件文件时,就会报错xxx已被CORS策略阻止,引入的资源还会失效。解决办法1 :Live......
  • Lock 锁底层实现
    ★1、讲讲Lock锁是一个接口,有三个实现类,分别是常用的可重入锁,读锁、写锁。常用的是可重入锁。加锁使用lock()方法,解锁使用unlock()方法。Lock的底层是AQS+CAS机......
  • 【每日一句sdc】create_gnerated_clock
    用途:当clk信号穿过触发器时,dc会把其当成普通信号处理,若果仍想其作为时钟信号往下传播,则需要将其声明成generated_clock, 是generate_clock的场景??todo协议:create_genera......
  • 中仑网络全站 Dubbo 2 迁移 Dubbo 3 总结
    简介: 中仑网络在2022年完成了服务框架从Dubbo2到Dubbo3的全站升级,深度使用了应用级服务发现、Kubernetes原生服务部署、服务治理等核心能力。来自中仑网络的技术......
  • ReentrantReadWriteLock 使用示例
    ReadWriteLock使用示例1.使用场景前两天同事发给我一个工具类,封装了调用第三方接口的方法。第三方接口调用需要带上访问凭据accessToken,需要先调用login接口传入usern......