同步(Synchronization)还是异步(Asynchronization)?

在开发程序的时候,我们经常会选择一个线程池中的线程通信使用何种方式。同步和异步是很经典有效的方式,那我们应该如何抉择呢?

首先认识下同步和异步:

同步(Synchronization)表示线程执行必须强行按照一定顺序,整个流程是死板的,容不得变通,释放资源的线程必须获得下一个申请资源的反馈,在得到反馈之前会被挂起,不会继续执行。即阻塞的。

异步(Asynchronization)表示线程释放完资源后会脱离对下个申请资源的线程的通信,无论后面发生了什么都不关心在意。即非阻塞的。

举个栗子:

晚上你打游戏很晚,妈妈过来说:“睡觉了宝宝。”然后你耍赖皮又拖了一会,最后实在没办法去睡觉了,在你睡着之前,妈妈一直在你旁边等着你,这就是同步,妈妈在看到你睡着之前是不会离开做其他事的,得到了你睡着的信息后,妈妈才离开。

而如果妈妈看到你耍赖皮很生气,就说了一句:早点睡。妈妈就离开了。这就是异步了,你爱睡不睡,妈妈生气了不关心。她批评完你就直接离开了,不会在意你给予什么反馈。

那么什么情况下用同步,什么情况下使用异步呢?

问题其实很简单,我们需不需要接受资源者做出即使反馈。

如果需要,比如重要数据库资源的保存,我们需要写入线程告诉我们:我写完了,保存吧您嘞。才能保存数据,否则就凉了。

亦比如我们的程序本身就有一定的流程,比如B步骤必须在A步骤之后进行,否则将出现逻辑错误,这时就必须使用线程同步保证逻辑的完整性和唯一性。

而如果我们不需要即使反馈,事情就很简单了。比如在Android里很火的广播机制(Broadcast),只需把信息广而告之,不需要接收者做出即使反馈。

同步有个小问题:

同步因为之前介绍的特性,导致其耗时必然是更多的,这是无可避免的,从OS的角度看,一个占了资源又挂起的线程可不是什么受欢迎的客人,所以在现在CPU多核的情况下,异步通信更为广泛的被使用(Ajax了解一下?)。

阻塞非阻塞和同步异步不是一码事哦:

简单来说:同步一般是阻塞的,异步一般是非阻塞的,但是特殊情况特殊对待。

知乎老哥讲的非常清楚了,复制一手链接,就很舒服,手打?不存在的。

https://www.zhihu.com/question/19732473/answer/20851256

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值