3,网络编程

简介: BIO为阻塞I/O,线程在连接和数据准备阶段均被占用,高并发下性能差;NIO通过非阻塞+多路复用,用少量线程处理大量请求,提升利用率;AIO实现异步I/O,数据复制由系统回调完成,线程更高效。Java 21引入虚拟线程,结合BIO编程习惯与NIO性能,大幅提升并发能力。(238字)

3.1说说 BIO,NIO,AIO
问这个问题,通常是考察你对Web应用高并发的理解预备知识
。开发Web应用,肯定分成客户端和服务器。客户端与服务器交互,肯定得做这么几件事:
服务器程等待有客户端连接上来客户端真的连"二来了,建立连接
客户端没有向服务器发送请求,此时服务器程需要等待数据准备好客户端向服务器发送请求,需要将请求数据从网卡复制到系统内存
。上面a.c。这两个阶段,没有客户端连接,没有数据请求,这时是否需要一个程时刻盯着?
如果需要占用一个程,那么就称程被阻
如果不需要程盯着,程可以腾出手来去干别的活,那么就称程非阻塞
.d。阶段的数据复制,不会用到CPU,也就是不会用列线程,同样也存在幾程阻塞还是幾程非阻塞两种情况 BIO(阻塞1/O)
是搭b.c.d。这几个阶段,程都得阻塞,腾不出手干别的,即使此时它无所事事,高并发下,阻塞线程多了,处理连接,处理请求的能力就会大受影响
增加程不可行,毕竟程是有限资源,这是成本问题
不增加幾程也不行,没有新程,没人去处理新连接,处理新请求 NIO(非阻塞1/O
是指b.c。这两个阶段,幾程可以不阻塞,腾出手干别的(怎么干别的,要靠多路复用)非阻塞I/O通常结合多路置用技术一起使用,能够在高并发下用少量程处理大量请求
多路复用是以面向事件的方式处理连接,处理德求,有事件发生才去处理,没有事件则不会占用幾程使用了多路复用技术后,新客户端来了要连换,客户端发来了新德求,都会产生事件,把这些事件交给一个贱程去统一处理就行了
程不会在高并发下存在无事可做的现象,它被充分压榨,利用率高 AIO(异步1/O)
.NIO在d。这个阶段,线程仍需阻塞,不能被解放出来干其它活
.AIO则更进一步,只需要提前准备好回调函数,在数据复制时幾程被解放,该干嘛干嘛,等数据复制完毕,由系统使用另外线程来调用回调函数做后续处理.AlO在Linux 下本质还是用多路复用技术来实现小结
.BIO并发性低,但代码更容易编写
.NIO并发性高,不过代码编写困难
.AlO并发性在Linux 下没有本质提高,用的人少[进阶]Java 21起,正式支持虚拟程
配合应拟程时,仍然是以BIO方式来编写代码,代码编写容易
虚拟程非常廉价,程不是不够吗,可动加就行(不用担心程闲置问题)
,Java 21重新实现了网络API,虚拟线程底层也会配合多路复用机制,在代码易编写的情况下,兼具高性
P.S.
.B是Blocking 阻塞
.N是Non-Blocking非阻塞.A是Asynchronous异步

相关文章
|
1天前
|
缓存 负载均衡 安全
第十章 常用组件1、nginx相关
正向代理是客户端通过代理访问外部服务器,隐藏客户端身份,用于访问受限资源或保护隐私;反向代理则是服务器前的代理,接收客户端请求并转发至内部服务器,隐藏真实服务器,实现负载均衡、安全防护与缓存加速,提升系统性能与安全性。
|
1天前
|
安全 Java 数据库连接
第五章 spring框架
Spring的IOC(控制反转)将对象创建交给容器管理,避免手动new;DI(依赖注入)则让容器自动注入所需对象。通过@Controller、@Service等注解声明Bean,使用@Autowired或@Resource实现注入。默认单例Bean无并发控制,若无状态则线程安全,否则需自行保证。
|
1天前
|
SQL 监控 关系型数据库
4、SQL性能分析及优化
通过SkyWalking链路追踪可定位慢接口及慢SQL,或开启MySQL慢查询日志(如设置超1秒记录)来识别执行慢的SQL。结合explain分析执行计划,关注key、type、extra等关键指标,判断索引命中与性能瓶颈,避免全表扫描,优化SQL性能。(238字)
|
1天前
|
NoSQL Java 数据库连接
第七章 SpringBoot框架
SpringBoot是简化Spring开发的框架,核心功能包括:starter起步依赖简化配置、自动配置实现Bean自动化管理、内嵌Web服务器支持jar包直接运行。常用starter如web、aop、redis等,分为官方与第三方两类,极大提升了开发效率。(238字)
|
1天前
|
Java Spring 容器
Spring Boot配置的优先级?
SpringBoot项目支持多种配置方式,主要包括配置文件(application.properties、.yml、.yaml)和外部配置(如系统属性、命令行参数)。优先级由高到低为:命令行参数 > 系统属性 > .properties > .yml > .yaml。自动配置核心是@SpringBootApplication中的@EnableAutoConfiguration,通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类,并结合@Conditional条件注解按需注入Bean。
|
1天前
|
Java Spring 容器
Spring Bean的作用域如何设置,常见的取值有哪些?
Spring Bean作用域可通过@Scope注解设置,常见有singleton(默认,单例)、prototype(每次创建新实例)、request(每请求一个实例)、session(每会话一个实例)。singleton在容器启动时初始化,可加@Lazy延迟;prototype则每次使用时创建。多数场景使用默认单例模式。
|
1天前
|
JSON 前端开发 Java
SpringMVC的拦截器用过没有?
拦截器常用于登录校验、参数处理、数据脱敏等,通过实现`HandlerInterceptor`接口,并在配置类中注册,限定拦截路径。与过滤器相比,拦截器基于Spring容器,仅拦截Controller请求,而过滤器作用于所有Web资源。异常处理可使用`@RestControllerAdvice`和`@ExceptionHandler`实现全局捕获。常用注解包括`@RequestMapping`、`@RequestBody`、`@RequestParam`、`@PathVariable`、`@ResponseBody`等,简化开发。
|
1天前
|
Java 数据库 数据安全/隐私保护
什么是AOP?
AOP(面向切面编程)是Spring框架的重要特性,用于将日志、事务、权限等公共逻辑抽离,实现模块复用、降低耦合。项目中常用AOP记录操作日志和权限控制,通过自定义@Log注解结合环绕通知,捕获方法执行信息并存入数据库,便于追踪核心业务操作。其底层基于动态代理实现。
|
1天前
|
缓存 Java Spring
聊-聊Spring中bean的循环依赖问题?
Spring通过三级缓存解决循环依赖:一级缓存存放完整单例Bean,二级缓存存放早期半成品Bean,三级缓存存放对象工厂用于创建代理等对象。A依赖B、B依赖A时,先创建A并放入三级缓存,实例化B时通过三级缓存获取A的工厂生成早期引用并放入二级缓存,B完成初始化后注入A,再将B注入A,最终双方都成功创建并放入一级缓存,流程结束清除二级缓存临时对象。
|
1天前
|
搜索推荐 算法 Java
2、排序
排序算法分为比较类和非比较类。比较类包括快排、归并、堆排(平均时间O(n log n))和插入排序(O(n²)),适用于不同数据规模与有序度;非比较类如计数、桶、基数排序,可达到O(n),依赖数据特征。实际应用中常结合多种算法优化性能。