一文了解JAVA中同步、异步、阻塞和非阻塞

news2024/11/17 21:55:03

🏆今日学习目标:

🍀JAVA中同步、异步、阻塞和非阻塞
创作者:林在闪闪发光
⏰预计时间:30分钟
🎉个人主页:林在闪闪发光的个人主页

 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的社区

目录

1. 同步和异步 

同步

异步

2. 阻塞和非阻塞

3. 同步、异步、阻塞和非阻塞IO

同步堵塞IO

 同步非阻塞IO

异步堵塞IO

 异步非阻塞IO

总结

 应用场景

典型的用户场景

使用异步后的烦恼

最后介绍一下项目中的经验:


1. 同步和异步 

同步和异步描述的是消息通信的机制。

同步

同步:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不能关闭界面,如果关闭了,即迁移程序就中断了。

异步

异步:将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。但是用户没有卡死的感觉,会告诉你,你的请求系统已经响应了。你可以关闭界面了。

不同的地方:

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;

异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。

2. 阻塞和非阻塞

阻塞和非阻塞描述的是程序在等待调用结果(消息,返回值)时的状态。

阻塞

阻塞调用是指调用方发出request的线程因为某种原因(如:等待系统资源)被服务方挂起,当服务方得到response后就唤醒挂起线程,并将response返回给调用方。

非阻塞

非阻塞调用是指调用方发出request的线程在没有等到结果时不会被挂起,直到得到response后才返回。

阻塞和非阻塞最大的区别就是看调用方线程是否会被挂起。

3. 同步、异步、阻塞和非阻塞IO

同步堵塞IO

  针对Sender而言,请求发送出去以后,一直等到Receiver有结果了才返回,这是同步。在Sender获取结果的期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。

场景:

 

有一天你饿了,想吃饭,但是你不会做,这时候你就跟你妈说:妈,我饿了,我要吃饭。然后你妈就去厨房做饭,你就在外面等着饭做好,啥也不干,这就是同步阻塞。(调用方阻塞不能干其他的事)   

 同步非阻塞IO

针对Sender而言,请求发送出去以后,立刻返回,然后再不停的发送请求,直到Receiver处理好结果后,最后一次发请求给Receiver才获得response。Sender一直在主动轮询,每一个请求都是同步的,整个过程也是同步的。在Sender等待Receiver的response期间一直是可以处理其它事情的(比如:可以发送请求询问结果),这是非阻塞。

场景:

有一天你饿了,想吃饭,但是你不会做,这时候你就跟你妈说:妈,我饿了,我要吃饭。然后你妈就去厨房做饭,你就在外面等着饭做好,啥也不干,这就是同步阻塞。(调用方阻塞不能干其他的事)

异步方式1 

同样,有一天你饿了,想吃饭,但是你不会做,这时候你就跟你妈说:妈,我饿了,我要吃饭。然后你妈就去厨房做饭,然后你就去看电视了。你妈做好饭就给你说,宝,饭做好了,去厨房把饭端到餐桌上。(调用方啥也不管,等好了自己去拿结果

异步方式2 

同样,有一天你饿了,想吃饭,但是你不会做,这时候你就跟你妈说:妈,我饿了,我要吃饭。然后你妈就去厨房做饭,然后你就去看电视了。你妈做好饭就给你说,宝,饭做好了、快来吃,你直接去餐桌上吃饭就是了。(调用方啥也不管,结果已经放好了,直接去看结果就可以了

异步方式2肯定是比异步方式1更好,但是Linux内核不支持,只能使用异步方式1,需要自己去拿结果。

异步堵塞IO

 

针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直被block住了,也就是在此期间Sender不能处理其它事情,这是阻塞。 

 异步非阻塞IO

针对Sender而言,请求发送出去以后,立刻返回,然后再等待Receiver的callback,最后再次请求获取response,这整个过程是异步。在Sender等待Receiver的callback期间一直是可以处理其它事情的,这是非阻塞。

总结

  • 同步和异步就看调用方是否需要通过callback、通知或者状态来获取结果
  • 阻塞和非阻塞就看调用方在发送请求后是否block住了

 同步:发送一个请求,等待返回,然后再发送下一个请求 
异步:发送一个请求,不等待返回,随时可以再发送下一个请求

同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。

异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。

同步和异步最大的区别就在于。一个需要等待,一个不需要等待。 

比如发短信,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息,则可以进行下一次发送。 
电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息

而我们平时经常讨论的同步问题多发生在多线程环境中的数据共享问题。即当多个线程需要访问同一个资源时,它们需要以某种顺序来确保该资源在某一特定时刻只能被一个线程所访问,如果使用异步,程序的运行结果将不可预料。因此,在这种情况下,就必须对数据进行同步,即限制只能有一个进程访问资源,其他线程必须等待。

实现同步的机制主要有临界区、互斥、信号量和事件 
临界区通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资 源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占

互斥量采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 

信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。 
事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 。

 应用场景

异步的使用场景:

1、不涉及共享资源,或对共享资源只读,即非互斥操作

2、没有时序上的严格关系

3、不需要原子操作,或可以通过其他方式控制原子性

4、常用于IO操作等耗时操作,因为比较影响客户体验和使用性能

5、不影响主线程逻辑

同步的使用场景:不使用异步的时候

同步的好处:

1、同步流程对结果处理通常更为简单,可以就近处理。

2、同步流程对结果的处理始终和前文保持在一个上下文内。

3、同步流程可以很容易捕获、处理异常。

4、同步流程是最天然的控制过程顺序执行的方式。

异步的好处:

1、异步流程可以立即给调用方返回初步的结果。

2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。

3、异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。

4、异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率

典型的用户场景

在公众号的运营过程中,典型的事件包括:

  • 发送短信验证码

  • 购买成功或者抽奖成功短信通知

  • 卡券或优惠券发放

  • 发放微信红包

  • 微信消息通知

  • 订单流程处理

  • 定时批处理(比如数据同步)

  • 工作流性质的异步任务(未完成异步任务补偿)

面详细说明不同场景能够异步的原因:

  1. 不同场景(用户注册,用户购买产品等)下的短信验证码发送,可以使用异步方式发送: 一方面是因为客户这个时效性要求没有那样高,另一方面在特定时间范围内用户没有收到验证码,用户可以点击再次发送验证码。

  2. 购买成功或者抽奖成功后短信或者邮件通知,可以通过异步的方式进行。 因为涉及用户的利益,要谨慎对待。一方面一定要把数据先存到数据库或者日志里面(注意信息安全^-^,别存敏感明文信息或者加密存储),然后再放入到异步队列中执行。

另一个方面,要考虑到应用服务意外停止时,没有发送成功数据的补偿机制。 这种情况不常见,并且为了减少耦合和当前异步程序的复杂度。我们使用单独的服务上部署异步任务补偿程序,来扫描未完成的任务,并且进行重放(一定要注意严谨性)。

    3.优惠券和卡券的发放,跟购买成功或抽奖成功的方式类似。\u000b可以在当前活动高峰后延时发放,并且使用异步的方式进行。

    4.优惠券和卡券的发放,跟购买成功或抽奖成功的方式类似。\u000b可以在当前活动高峰后延时发放,并且使用异步的方式进行。

    5.微信消息通知,因为跟微信进行交互,成功后微信进行通知,可以使用异步。 这个跟短信验证码类似。

    6.订单流程处理,可以使用异步,因为涉及到后续步骤可以使用简单工作流来完成。有几个开源的框架可以参考。

    7.数据同步或者异步任务补偿,因为是延时处理,可以使用异步进行处理。在使用时,可以配合定时任务,比如cron4j来周期性的进行补偿。适合后面总-分-总的任务处理模式。

使用异步后的烦恼

烦恼一: 数据丢失的风险

解决方式:先写日志或数据库,后放入异步队列.

烦恼二:对其他系统的压力变大

解决方式:使用一定的限流和熔断,对其他系统进行保护。

烦恼三:数据保存后异步任务未执行

解决方式:使用异步任务补偿的方式,定期从数据库中获取数据,放到队列中进行执行,执行后更新数据状态位。

烦恼四:怎样队列长设置和消费者数量

解决方式:使用实际的压力测试来获得队列长度。或者使用排队论的数学公式得到初步的值,然后进行实际压测。

最后介绍一下项目中的经验:

    • 量力而行:根据业务特点进行技术选型,业务量小尽量避免使用异步。有所为,有所不为

    • 数据说话:异步时一定要进行必要的压力测试

    • 先找出系统的关键点:优化单体系统内的性能,再通过整体系统分解来全局优化

    • 根据团队和项目的特点选择框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/350015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器入门使用流程 新手学习教程

一、阿里云根据个人需要选合适的云服务器,选好cpu、内存、带宽,地域,这四个是主要的。其他可以默认选择。 二、登陆控制台 输入账号密码,进去看到服务界面,新手可能不容易看懂。点击左侧菜单,点击云服务器…

ASE12N65SE-ASEMI高压MOS管ASE12N65SE

编辑-Z ASE12N65SE在ITO-220AB封装里的静态漏极源导通电阻(RDS(ON))为0.68Ω,是一款N沟道高压MOS管。ASE12N65SE的最大脉冲正向电流ISM为48A,零栅极电压漏极电流(IDSS)为10uA,其工作时耐温度范围为-55~150摄氏度。ASE…

Web IDE优势在哪?详解Web版数据库管理工具SQL Studio

Web IDE优势在哪?详解Web版数据库管理工具SQL Studio 去年年末,GitPod在A轮融资中获得2500万美元,用来兑现云端开发环境(Cloud Development Environments)的承诺。 一周后,GitHub就宣布CodeSpaces将面向所…

【Python入门第十天】Python 布尔

布尔表示两值之一:True 或 False。 布尔值 在编程中,通常需要知道表达式是 True 还是 False。 可以计算 Python 中的任何表达式,并获得两个答案之一,即 True 或 False。 比较两个值时,将对表达式求值,P…

如何做出好看的Excel可视化图表?

可视化死磕excel是不行的,作为数据分析行业的偷懒大户,分享一些我在可视化工具上的使用心得,总结了三大类:快速出图类、专业图表类、高端大屏类。个人经验,大家按需采纳: 一、快速出图类 如果你只是因为偶…

如何重新安装安卓手机系统

下载并安装您设备的驱动程序和ADB工具。如果您已经拥有了它们,请跳过此步骤。没有就百度下载。 打开终端或命令提示符,并将其设置为包含ADB二进制文件的目录。 启动设备并将其连接到计算机上。 在终端或命令提示符中运行以下命令以确认设备是否连接成…

vue脚手架项目的详解

文章目录Vue CLI简介安装vue-cli创建项目启动项目打包项目项目结构对Vue不同构建版本的解释完整的版本信息术语运行时 编译器 vs. 只包含运行时开发环境 vs. 生产环境模式单文件组件为什么需要单文件组件什么是单文件组件<template><script><style>自动名称…

Python常见类型转换合集

近期在工作中常常接触到各种转换&#xff0c;如字符串转byte&#xff0c;byte转字符串&#xff0c;还有byte数组转成报文能接纳的格式&#xff08;bin格式的十六进制&#xff09;。故有必要系统的总结一下Python中常见的类型转换。 一&#xff1a;常见类型的概念 类型举例说明…

【企业档案管理】制药企业电子档案解决方案

某制药股份有限公司于2010年在深交所中小板上市&#xff0c;公司以生产中药制剂为主&#xff0c;化学药为辅&#xff0c;拥有药品批准文号155个&#xff0c;其中73个列入国家医保目录&#xff0c;57个列入国家基本药物目录。现有员工1300人&#xff0c;公司注册资金5.032亿元&a…

从零实现Web服务器(三):日志优化,压力测试,实战接收HTTP请求,实战响应HTTP请求

文章目录一、日志系统的运行流程1.1 异步日志和同步日志的不同点1.2 缓冲区的实现二、基于Webbench的压力测试三、HTTP请求报文解析http报文处理流程epoll相关代码服务器接收http请求四、HTTP请求报文响应一、日志系统的运行流程 步骤: 单例模式&#xff08;局部静态变量懒汉…

手把手带你读java源码之JAVA-stream数据结构和初始化源码详解(万字长文详解)

手把手带你读java源码之JAVA-stream数据结构和初始化源码详解(万字长文详解) stream stream是java8新增的非常重要的一个特性。并且非常的常用。它实现了函数式编程。具体函数式编程的概念已经很久了&#xff0c;比如js中的箭头函数。java中也通过stream做出了支持。想深入理…

云原生安全检测器 Narrows(CNSI)的部署和使用

近日&#xff0c; 云原生安全检测器 Narrows&#xff08;Cloud Native Security Inspector&#xff0c;简称CNSI&#xff09;发布了0.2.0版本。 &#xff08;https://github.com/vmware-tanzu/cloud-native-security-inspector&#xff09; 此项目旨在对K8s集群中的工作负载进…

分布式文件管理系统(MinIO)

1.去中心化&#xff0c;每个点是对等的关系&#xff0c;通过Ngix对负载做均衡工作。 好处&#xff1a; 能够避免单点故障&#xff0c;将多块硬盘组成一个对象存储服务。 2. 使用纠删编码技术来保护数据&#xff0c;是一种回复丢失和损坏的数据的数学算法&#xff0c;他将数据分…

小红书用户画像 | 小红书数据平台

小红书的用户画像是小红书品牌营销的必备技能&#xff0c;也是小红书推广种草的一个重要前提。通过对小红书用户画像进行分析&#xff0c;对品牌进行精准营销&#xff0c;实现更高的流量转化。 2022小红书粉丝人群画像 千瓜数据在2022年发布的千瓜活跃用户画像趋势报告中分析了…

Hive---安装教程

Hive安装教程 Hive属于Hadoop生态圈&#xff0c;所以Hive必须运行在Hadoop上 文章目录Hive安装教程上传安装包解压并且更名修改 /etc/profile创建hive-site.xml将mysql的jar包放入Hive库中开启刷新配置文件hadoop开启mysql初始化启动hive上传安装包 将安装包上传到/opt/insta…

一文搞懂Docker容器里进程的 pid 是如何申请出来的?

如果大家有过在容器中执行 ps 命令的经验&#xff0c;都会知道在容器中的进程的 pid 一般是比较小的。例如下面我的这个例子。 # ps -ef PID USER TIME COMMAND1 root 0:00 ./demo-ie13 root 0:00 /bin/bash21 root 0:00 ps -ef 不知道大家是否和我一样…

始于日志,不止于日志,Elastic Stack全面介绍

1、Elastic Stack是什么&#xff1f; 说Elastic Stack之前&#xff0c;先说一下ELK Stack。这个词相信很多人都是耳熟能详的&#xff0c;作为一个著名的日志系统解决方案&#xff0c;应用非常广泛。 “ELK”是三个开源项目的首字母缩写词&#xff1a;Elasticsearch、Logstash…

第五章.与学习相关技巧—Batch Normalization

第五章.与学习相关技巧 5.3 Batch Normalization Batch Norm以进行学习时的mini_batch为单位&#xff0c;按mini_batch进行正则化&#xff0c;具体而言&#xff0c;就是进行使数据分布的均值为0&#xff0c;方差为1的正则化。Batch Norm是调整各层激活值的分布使其拥有适当的广…

进程组和用处

进程组&#xff1a;一个或多个进程的集合&#xff0c;进程组id是一个正整数。组长进程&#xff1a;进程组id 进程id组长进程可以创建一个进程组&#xff0c;创建该进程组的进程&#xff0c;终止了&#xff0c;只要进程组有一个进程存在&#xff0c;进程组就存在&#xff0c;与…

卷积神经网络(CNN)

目录The Basic Usage of CNNPadding&#xff08;填充&#xff09;Weights&#xff08;权重&#xff09;PoolingThe Basic Usage of CNN What are Convolutional Neural Networks? They’re basically just neural networks that use Convolutional layers&#xff08;卷积层…