首页
学习
活动
专区
圈层
工具
发布

关于同步方法里面调用异步方法的探究

但是看了dudu的文章:一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相 了解了,这样写是有问题的。但是为什么会有问题呢?...同步方法里调用异步方法 同步方法里调用异步方法,一种是wait() 一种是不wait() void fun() { funAsync.Wait(); funAsync(); } 这两种场景都没有编译错误...到此我们可以证明,在同步方法里调用异步方法确实是不安全的,尤其在并发量很高的情况下。 探究原因 我们再深层次讨论下为什么同步方法里调用异步方法会卡死,而异步方法调用异步方法则很安全呢?...然后我们再关注下,同步方法里调用异步方法并且.Wait()的情况下会发生什么。...第二种情况:在同步方法里调用异步方法,不wait() 如果这个异步方法进入的是global Task 则在线程饥饿的情况下,也会发生死锁的情况。

3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    同步调用和异步调用

    对于同步与异步来说,好多人与我在初学的时候一样,肯定是一脸蒙x。不过没关系,慢慢来,我将我见到和理解的和大家分享一下,希望对大家有所帮助。...在这里先简单的说一下同步和异步,然后再通过一个我看过的小故事帮助大家进行记忆。...同步:与我们的认知稍微有些偏差,注意它并不是我们之前的“同步”(一起做,同时做),python中的多任务,所说的同步指的是按顺序来,也就是一件任务在执行的时候,会等待当前的任务执行完,再执行下一个任务。...网上某位大神曾讲过一个小故事: 同步调用就好像是去超市买东西,当你看见一台空调,它功能十分的强大,你十分的喜爱,满足你现在的需求,于是你决定买下来,然后导购和你说:先生,感谢您的喜爱,这台是展示机,我们会去仓库调取一台全新的...空调终于回来了,卖家将你和空调用三轮车拉到了你家。你很开心的完成了买空调的任务。 异步就好像是你逛电商,某宝,某东。然后看到了空调,正在秒杀,你开心坏了,真是天助我也。然后就就下单了,这件事就完成了。

    1.9K30

    为什么wait和notify方法要在同步块中调用?

    (); synchronized (lock) { lock.wait(); lock.notifyAll(); } } 也就是说wait和notify方法要在基于同一个对象的同步块中使用...为什么wait和notify方法要在同步块中调用? 我们先来发出一个灵魂拷问:什么时候才需要wait? 什么时候又需要notify?...我们假设我们要实现一个堵塞队列,如果不加同步块,我们的实现方法可能如下。...take,发现buffer.isEmpty 在消费者调用wait之前,由于cpu的调度,消费者线程被挂起,生产者调用add,然后notify 然后消费者调用wait (注意,由于错误的条件判断,导致wait...所以:wait和notify方法要在同步块中调用的根本原因是,这两个方法存在竞态条件。如果不加锁的话,那么wait被调用的时候可能wait的条件已经不满足了(如上述)。

    1.3K20

    同步调用、回调和异步调用区别

    同步调用是以一种阻塞式调用 比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。...回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口 同样上面的例子: 现在我们还是A、B、C、D,但是A中有一个去B的信鸽(b),同样B中有(c),C中有(d)。...complete send to D do C message from c if Message From d do D 这种就是在函数的参数中带有一个其他函数指针,当需要的时候我们可以通过函数指针名进行调用其他函数即发送消息到其他函数...异步调用 异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。...下面我我写三个例子,大家来看一下具体每个例子是什么调用方式。 例一: var temp = false; while(!

    5.1K61

    同步调用、回调和异步调用区别

    同步调用是以一种阻塞式调用 比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。...回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口 同样上面的例子: 现在我们还是A、B、C、D,但是A中有一个去B的信鸽(b),同样B中有(c),C中有(d)。...complete send to D do C message from c if Message From d do D 这种就是在函数的参数中带有一个其他函数指针,当需要的时候我们可以通过函数指针名进行调用其他函数即发送消息到其他函数...异步调用 异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。...下面我我写三个例子,大家来看一下具体每个例子是什么调用方式。 例一: var temp = false; while(!

    1.1K20

    java 为什么wait(),notify(),notifyAll()必须在同步方法代码块中调用?

    所有对象的非同步方法都能够在任意时刻被任意线程调用,此时不需要考虑加锁的问题。而对于对象的同步方法来说,在任意时刻有且仅有一个拥有该对象独占锁的线程能够调用它们。例如,一个同步方法是独占的。...这一点通常不会被程序员注意,因为程序验证通常是在对象的同步方法或同步代码块中调用它们的。...这意味着在调用某对象的wait()方法之前,当前线程必须已经获得该对象的锁。因此,线程必须在某个对象的同步方法或同步代码块中才能调用该对象的wait()方法。...因此,必须在某个对象的同步方法或同步代码块中才能调用该对象的notify()或notifyAll()方法。...wait()方法是object类的方法,解决的问题是线程间的同步,该过程包含了同步锁的获取和释放,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify()方法才会重新激活调用者

    2.1K10

    基本线程同步(一) 同步方法

    在这个指南中,我们将学习在Java中如何使用一个最基本的同步方法,即使用 synchronized关键字来控制并发访问方法。...你必须非常小心这一点,因为两个线程可以访问两个不同的同步方法,如果其中一个是静态的而另一个不是。如果这两种方法改变相同的数据,你将会有数据不一致 的错误。...在没有同步方法,我们可能得到不正确的结果。同步机制保证了账户的正确。 准备工作 这个指南的例子使用Eclipse IDE实现。...在这个程序中,每次都调用100次addAmount()方法来增加1000 的余额和调用100次subtractAmount()方法来减少1000的余额。你应该期望最终的余额和初始的余额是相等的。...如果你知道一个方法将不会被多个线程 调用,请不要使用synchronized关键字。 你可以使用递归调用synchronized方法。

    1.5K90

    Storm同步调用之DRPC模型探讨

    所以也就决定了storm无法提供对外部系统的同步调用功能。   ...最近新的黑名单项目需要在storm实时计算平台上提供对外部系统请求调用的同步响应(也就是让storm支持同步调用而不是回调),而Storm的编程模型是一个有向无环图,也就决定了storm的spout接收到外部系统的请求后...自己如何基于storm实现同步调用    我也自己思考下,如果是我自己会如何在现有的storm的编程模型下如何实现同步调用。...貌似可以,但是查看spout的调用源代码会发现,如果这样会导致spout的吞吐量下降,因为spout只有从redis轮询到当次请求的处理结果后才会在循环调用nextTuple()方法,当然在spout实现类中开启多线程后...,貌似可以解决nextTuple方法阻塞(具体没有去想,因为本身这个方案不可行了,就没必须去掉头发了)storm的任务中再去开多线程是无效率的,还不如不选择storm技术。

    1.1K10
    领券