自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

木卯的专栏

低调做人,高调做事。

  • 博客(119)
  • 收藏
  • 关注

原创 一文解决所有SpringCloud升级问题

随着项目的深入开展,客户对系统安全性提出了更高的要求,尤其是在安全漏洞和渗透测试方面。当前,我们使用的 SpringCloud 版本是 Hoxton,其生命周期已于 2022 年 2 月 28 日结束。为了给客户提供更安全的产品,同时使代码更易于维护和扩展,升级 SpringCloud 版本势在必行。通过以上内容,我们可以顺利完成 SpringCloud 版本的升级,为客户提供更加安全和高效的系统。为了以后 JDK 版本升级时代码兼容,尽量使用兼容性好的依赖,例如:base64 处理使用。

2024-07-26 06:27:15 238

原创 SpringMvc有几个上下文

如果是一个Handler,就通过反射找出加了@RequestMapping注解的Method,并解析@RequestMapping注解上定义的参数信息,得到一个对应的RequestMappingInfo对象,然后结合beanType上@RequestMapping注解所定义的path,以及当前Method上@RequestMapping注解所定义的path,进行整合,则得到了当前这个Method所对应的访问路径,并设置到RequestMappingInfo对象中去。

2024-07-21 18:05:35 1115 1

原创 用AI生成Springboot单元测试代码太香了

幸运的是,随着AI技术的发展,我们可以利用AI工具来自动生成单元测试代码,极大地提高了开发效率。注解的方法中,我们模拟了一个MultipartFile对象,并设置了它的一些行为。:AI工具可以自动生成大量的单元测试代码,减少了开发者的工作量,使他们能够专注于核心业务逻辑的开发。:AI可以快速生成单元测试代码,开发者只需稍作修改即可使用,大大减少了手动编写的时间。:AI生成的代码通常遵循最佳实践和规范,减少了由于手动编写代码而引入的错误。:生成的代码结构清晰、易于理解,方便后续的维护和扩展。

2024-07-17 06:33:42 435

原创 一文说透Springboot单元测试

Service层的单元测试:基本上一个Service里面肯定会依赖很多其他的service(此处也建议将成员变量通过构造方法进行注入,以便于单元测试去Mock),此时建议我们将依赖其他service的方法用Mock替代,Service里面的一些数据库的操作也进行Mock。这里的一个强大的好处是,您可以跨各种测试场景重用应用程序上下文(例如,用于配置spring管理的对象图、事务代理、数据源实例等),从而避免了为单个测试用例复制复杂测试fixture设置的需要。把路上的问题记录下来,帮助那些和我一样的人。

2024-07-16 06:13:38 1048

原创 Spring AOP 实现 Excel 导出统一处理

通过使用 Spring AOP 和 ExcelResponseAspect 类,我们可以实现 Excel 导出的统一处理,将导出逻辑与业务逻辑分离,提高了代码的可维护性和可重用性。在实际开发中,经常会遇到需要导出 Excel 数据的需求。该类使用了注解 @ExcelResponse 来标记需要进行 Excel 导出的方法,然后根据注解的配置来处理导出逻辑。要使用 ExcelResponse 注解来标记需要导出 Excel 的方法,需要在方法上添加 @ExcelResponse 注解,并配置相关属性。

2024-07-13 16:59:47 574

原创 深入解析SpringMVC执行流程:从源码到架构设计

正式名称“Spring Web MVC”来自其源模块的名称(spring-webmvc),但它通常被称为“Spring MVC”。DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter,执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作。处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。

2024-07-13 07:59:59 828

原创 Springboot如何通过配置来决定使用的Web容器

利用Spring Boot的条件配置功能,我们可以根据配置文件中的属性值来动态选择Web容器,从而满足不同环境和需求。希望通过本文的介绍,大家能更好地理解和应用Spring Boot的条件配置功能,为项目选择最合适的Web容器。通过Spring Boot的条件配置功能,我们可以根据配置文件中的属性值来灵活地选择Web容器。通过这种方式,我们可以灵活地控制应用程序在不同环境中的Web容器选择,提高应用程序的可维护性和适应性。在生产环境中,可以根据需求选择性能更优的Web容器,如Jetty或Undertow。

2024-07-11 06:35:27 512

原创 基于Java-VUE-SpringBoot-MySQL的酒店管理系统-毕业设计选题

该项目采用市面上比较流程的前后端分离架构,以SpringBoot技术栈为后端,以VUE为前端,采用优雅简洁漂亮的UI框架。系统采用前端发起请求,后端处理业务的方式进行交互,相对于传统的JSP,freemarker等技术有较大区别以及先进性。同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。部署方便,作者编写了一键启动的脚本,可以让Java后端完美运行在主流服务器上。清晰的注释,每个方法,类,字段,都具备中文注释。代码符合行业规范,变量,类,命名简洁优雅。

2024-07-09 06:42:23 825

原创 Springboot如何自定义条件注解

在现代Java开发中,Spring框架提供了丰富的注解功能,使得配置和管理Bean变得异常简单和灵活。其中,条件化注解(Conditional Annotations)是一个强大的工具,它允许我们根据特定条件有选择地创建或启用Spring Bean。是Spring Boot中常用的一个条件注解,它允许我们根据配置文件中的属性值来控制Bean的创建。希望通过这篇文章,大家能够更好地理解和应用自定义条件注解,提升Spring应用的开发效率和质量。根据配置文件中的属性值,决定是否创建Bean。

2024-07-09 06:21:22 274

原创 基于SpringBoot2.X-VUE-Antd-MyBatis的民政救助系统毕业设计选题

基于SpringBoot2.X-VUE-Antd-MyBatis的民政救助系统毕业设计选题。若演示地址不可用,可翻到文末扫码联系作者微信或者留言。若演示地址不可用,可联系作者微信或者留言。分模块开发,自定义启动脚本,JVM调优。VUE路由,过滤器,自定义指令。orika传输对象映射器。系统菜单修改(可级联修改)页面,按钮级别权限控制。多个组件封装,调用方便。代码简洁,符合编码规范。多环境,前后端完全分离。后端Java代码截图展示。前端VUE代码截图展示。系统在线数,访问数统计。MyBatis注解版。

2024-06-30 17:43:19 325

原创 SpringCloud微服务又想变回单体怎么办

通过上述两种配置方式,我们可以根据不同的部署模式,灵活地调整Spring Boot应用的配置,满足从微服务到单体的转变需求。在实际开发中,可以根据具体的业务需求和部署环境,进一步优化和扩展这些配置策略,以实现最佳的系统架构。然而,在生产环境中,我们仍然可以保持公有云部署模式,通过Feign客户端进行服务调用,确保系统的灵活性和可扩展性。在公有云部署模式下,产品服务通过Feign调用服务提供接口,需要扫描和注册Feign客户端,同时避免扫描指定包下的组件。把路上的问题记录下来,帮助那些和我一样的人。

2024-06-30 17:06:00 311

原创 基于Java-VUE-SpringBoot-MySQL的体检预约系统-毕业设计

该项目采用市面上比较流程的前后端分离架构,以SpringBoot技术栈为后端,以VUE为前端,采用优雅简洁漂亮的UI框架。系统采用前端发起请求,后端处理业务的方式进行交互,相对于传统的JSP,freemarker等技术有较大区别以及先进性。同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。部署方便,作者编写了一键启动的脚本,可以让Java后端完美运行在主流服务器上。清晰的注释,每个方法,类,字段,都具备中文注释。代码符合行业规范,变量,类,命名简洁优雅。

2024-06-16 18:30:32 793

原创 深度解析Spring事务管理:从源码到实际应用

一个Bean在执行Bean的创建生命周期时,会经过InfrastructureAdvisorAutoProxyCreator的初始化后的方法,会判断当前当前Bean对象是否和BeanFactoryTransactionAttributeSourceAdvisor匹配,匹配逻辑为判断该Bean的类上是否存在@Transactional注解,或者类中的某个方法上是否存在@Transactional注解,如果存在则表示该Bean需要进行动态代理产生一个代理对象作为Bean对象。

2024-06-16 18:16:20 1003

原创 Spring 整合 MyBatis 底层源码解析

在Spring整合Mybatis后,如果执行某个方法时,该方法上没有加@Transactional注解,也就是没有开启Spring事务,那么后面在执行具体sql时,每执行一个sql时都会新生成一个SqlSession对象来执行该sql,这就是我们说的一级缓存失效(也就是没有使用同一个SqlSession对象),而如果开启了Spring事务,那么该Spring事务中的多个sql,在执行时会使用同一个SqlSession对象,从而一级缓存生效。大家好,我是柳岸花开。

2024-06-15 16:41:34 995

原创 流浪动物救助系统后台及微信小程序-宠物驿站项目-毕设选题-源代码

该项目采用市面上比较流程的前后端分离架构,以SpringBoot技术栈为后端,以VUE为前端,采用优雅简洁漂亮的UI框架。系统采用前端发起请求,后端处理业务的方式进行交互,相对于传统的JSP,freemarker等技术有较大区别以及先进性。同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。部署方便,作者编写了一键启动的脚本,可以让Java后端完美运行在主流服务器上。清晰的注释,每个方法,类,字段,都具备中文注释。代码符合行业规范,变量,类,命名简洁优雅。

2024-06-10 19:09:41 930

原创 基于Java-SpringBoot-VUE-MySQL的高校数字化迎新管理系统

该项目采用市面上比较流程的前后端分离架构,以SpringBoot技术栈为后端,以VUE为前端,采用优雅简洁漂亮的UI框架。系统采用前端发起请求,后端处理业务的方式进行交互,相对于传统的JSP,freemarker等技术有较大区别以及先进性。同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。部署方便,作者编写了一键启动的脚本,可以让Java后端完美运行在主流服务器上。清晰的注释,每个方法,类,字段,都具备中文注释。代码符合行业规范,变量,类,命名简洁优雅。

2024-06-10 19:08:48 782

原创 基于Java-SpringBoot-VUE-MySQL的企业财务报销系统

该项目采用市面上比较流程的前后端分离架构,以SpringBoot技术栈为后端,以VUE为前端,采用优雅简洁漂亮的UI框架。系统采用前端发起请求,后端处理业务的方式进行交互,相对于传统的JSP,freemarker等技术有较大区别以及先进性。同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。部署方便,作者编写了一键启动的脚本,可以让Java后端完美运行在主流服务器上。清晰的注释,每个方法,类,字段,都具备中文注释。代码符合行业规范,变量,类,命名简洁优雅。

2024-06-10 19:08:11 942

原创 面试官:Spring如何解析配置类

如果配置类上存在@ComponentScan注解,那么则解析该注解,进行扫描,扫描得到一系列的BeanDefinition对象,然后判断这些BeanDefinition是不是也是配置类BeanDefinition(只要存在@Component注解就是配置类,所以基本上扫描出来的都是配置类),如果是则继续解析该配置类,如果ConfigurationClass中存在一些BeanMethod,也就是定义了一些@Bean,那么则解析这些@Bean,并生成对应的BeanDefinition,并注册。

2024-06-10 18:20:26 825

原创 Spring Boot 应用打 WAR 包后无法注册到 Nacos怎么办

在开发过程中,通常使用 JAR 包运行 Spring Boot 应用,这种方式下,服务注册到 Nacos 通常没有问题。然而,在将 Spring Boot 应用打包成 WAR 部署到外部服务器时,可能会遇到服务无法注册到 Nacos 的问题。同时,结合 Nacos 的服务注册与发现功能,可以更加灵活地管理微服务架构中的各个服务。为了在 WAR 包部署时正确地注册服务到 Nacos,我们需要动态地获取实际使用的服务器端口,并将其设置到 Nacos 的服务注册中。把路上的问题记录下来,帮助那些和我一样的人。

2024-06-05 16:58:04 426

原创 Spring Boot既打jar包又打war包如何做

通过Maven Profiles,我们可以非常灵活地控制Spring Boot项目的打包过程。Maven Profiles是Maven提供的一种功能,允许用户根据不同的需求定义不同的构建配置。结合Maven Profiles,我们可以定义两种不同的打包方式:jar和war。以下是示例项目的Maven配置,展示了如何根据不同的Profiles来打包Spring Boot应用。这里使用了Maven的属性替换功能,根据激活的Profile动态设置打包类型。这个Profile是默认激活的,用于打包成jar格式。

2024-06-04 16:17:51 611

原创 面试官:说一下Spring的启动过程

可以看到BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,并新增了一个方法,注意方法的参数为BeanDefinitionRegistry,所以如果提供一个类来实现BeanDefinitionRegistryPostProcessor,那么在postProcessBeanDefinitionRegistry()方法中就可以注册BeanDefinition了。

2024-06-03 06:30:47 680

原创 深入剖析Spring框架:推断构造方法与@Bean注解的内部机制

并且后续在根据BeanDefinition创建Bean时,会根据isFactoryMethodUnique来操作,如果为true,那就表示当前BeanDefinition只对应了一个方法,那也就是只能用这个方法来创建Bean了,但是如果isFactoryMethodUnique为false,那就表示当前BeanDefition对应了多个方法,需要和推断构造方法的逻辑一样,去选择用哪个方法来创建Bean。,Spring将寻找所有匹配的方法,并根据参数类型和数量进行排序,选择最合适的方法来创建Bean。

2024-05-07 21:42:48 704

原创 什么?你用service调controller,那参数校验怎么办?

总之,通过使用Spring AOP和Bean Validation实现统一的参数验证方法,我们提高了API的可靠性和健壮性。然而,通过集中验证逻辑,我们可以简化流程,并确保应用程序的统一性。为了执行参数验证,我们利用Bean Validation,这是一个标准的Java EE规范,提供了一种声明性的验证Java对象的方式。通过使用验证约束,如。在拦截方法调用时,我们遍历方法参数,针对每个参数进行验证,并根据定义的约束检查是否违反。,我们确保验证仅在特定的部署环境下生效,例如我们的情况下的“合并”模式。

2024-05-04 21:07:57 507

原创 SpringBoot这29个注解你都用到过么

注解用于绑定HTTP请求中的Cookie值到方法参数,可以用在方法参数上。注解用于将方法返回值放入缓存,并且总是执行方法,可以用在方法上。这些注解用于定义在特定Bean存在或不存在时的条件配置,可以用在。这些注解用于定义在特定类存在或不存在时的条件配置,可以用在。注解用于定义在特定属性存在或满足条件时的条件配置,可以用在。注解用于将方法的返回值添加到模型中,可以用在方法上。注解用于定义在特定资源存在时的条件配置,可以用在。注解用于定义异步执行的方法,可以用在方法上。

2024-04-27 09:06:11 548

原创 深入剖析Spring框架:循环依赖的解决机制

如果当前Bean没有出现循环依赖,那么这个Lambda表达式没用,当前bean按照自己的生命周期正常执行,执行完后直接把当前bean放入singletonObjects中,如果当前bean在依赖注入时发现出现了循环依赖(当前正在创建的bean被其他bean依赖了),则从三级缓存中拿到Lambda表达式,并执行Lambda表达式得到一个对象,并把得到的对象放入二级缓存((如果当前Bean需要AOP,那么执行lambda表达式,得到就是对应的代理对象,如果无需AOP,则直接得到一个原始对象))。

2024-04-21 21:01:29 705

原创 Spring之底层架构核心概念解析

在Spring的源码实现中,当我们new一个ApplicationContext时,其底层会new一个BeanFactory出来,当使用ApplicationContext的某些方法时,比如getBean(),底层调用的是BeanFactory的getBean()方法。和申明式事务、编程式事务类似,通过< bean/>,@Bean,@Component等申明式方式所定义的Bean,最终都会被Spring解析为对应的BeanDefinition对象,并放入Spring容器中。

2024-04-08 07:00:45 1100

原创 Spring注入方式解析与实践

2.如果是Collection,则会调用方法findAutowireCandidates(beanName, type, descriptor),该方法返回一个Map,表示会根据type去找bean,Map的key为beanName,Map的value为对象(注意可能是bean对象,也可能是某个bean的class对象,因为该方法只负责根据类型找到对应的bean,如果该bean还没有实例化,那么该方法不负责去实例化,只返回该Bean对应的Class对象,表示这个Bean也是结果之一)

2024-04-04 20:34:18 919

原创 基于Java-SpringBoot-VUE的前后端分离的养老驿站管理系统-毕业设计-源代码

该项目采用市面上比较流程的前后端分离架构,以SpringBoot技术栈为后端,以VUE为前端,采用优雅简洁漂亮的UI框架。系统采用前端发起请求,后端处理业务的方式进行交互,相对于传统的JSP,freemarker等技术有较大区别以及先进性。同时在权限控制方面有独到的创新,实现了VUE自定义指令,以控制系统权限到每一个系统按钮。毕业设计、开题报告、论文、论文写作、论文答辩、简历项目、接单统统搞定!清晰的注释,每个方法,类,字段,都具备中文注释。代码符合行业规范,变量,类,命名简洁优雅。

2024-03-25 21:01:23 971

原创 深入探究Spring中Bean的生命周期

在Spring源码中,AutowiredAnnotationBeanPostProcessor就是一个MergedBeanDefinitionPostProcessor,它的postProcessMergedBeanDefinition()中会去查找注入点,并缓存在AutowiredAnnotationBeanPostProcessor对象的一个Map中(injectionMetadataCache)。本文将深入探讨Bean的生命周期,从Bean的生成到销毁,逐步解析Spring框架中的关键步骤。

2024-03-22 20:57:38 983

原创 到底什么时候该使用MongoDB

MySql是关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,底层索引组织数据使用B+树,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。在复制集架构中,主节点与备节点之间是通过 oplog 来同步数据的,这里的 oplog 是一个特殊的固定集合,当主节点上的一个写操作完成后,会向 oplog 集合写入一条对应的日志,而备节点则通过这个 oplog 不断拉取到新的日志,在本地进行回放以达到数据同步的目的。其结果是,垂直扩展有一个实际的最大值。

2024-03-18 20:44:22 1436

原创 Spring的简单使用及内部实现原理

在这个示例中,我们使用了AnnotationConfigApplicationContext来加载应用程序的配置类AppConfig,并通过context.getBean()方法获取了一个名为userService的Bean,最后调用了其test()方法。它通过注解的方式告诉Spring在哪里扫描需要管理的Bean,并通过@Bean注解来声明Bean。Spring使用cglib进行AOP时,会生成一个代理类,并在代理类中重写被代理类的方法,在执行代理方法时,会先执行切面逻辑,然后再调用被代理方法。

2024-02-29 21:33:11 1002 1

原创 9个接口性能优化方案,RT从9000ms到180ms

总的来说,接口性能优化是一个不断迭代的过程,我将继续努力,不断提升系统的性能,为用户提供更加流畅、高效的使用体验。我用的阿里的 Arthas,下载地址:https://arthas.aliyun.com/doc/download.html。不要在循环中查库,可以把符合条件的数据查出来放 map 中,以空间换时间。经过不断的优化,将接口从 9000ms 优化到 180ms,先看结果。减少不必要的 RPC 调用,如果必须查,通过一组条件查,加缓存。使用连接池,重用连接,避免重复创建的性能损耗。

2024-02-28 21:38:32 976

原创 你遇到过缓存雪崩、缓存穿透、缓存击穿么

​缓存雪崩对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,重启数据库,但是数据库立马又被新的流量给打死了。缓存雪崩的事前事中事后的解决方案如下:事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。事中:本地 ehcache 缓存 + hystri

2021-07-14 21:17:44 221 1

原创 如何设置线程池大小

如何设置线程池大小线程池的线程数量设置过多会导致线程竞争激烈,如果线程数量设置过少的话,还会导致系统无法充分利用计算机资源。那么如何设置才不会影响系统性能呢?线程池原理在 HotSpot VM 的线程模型中,Java 线程被一对一映射为内核线程。Java 在使用线程执行程序时,需要创建一个内核线程;当该 Java 线程被终止时,这个内核线程也会被回收。因此 Java 线程的创建与销毁将会消耗一定的计算机资源,从而增加系统的性能开销。除此之外,大量创建线程同样会给系统带来性能问题,因为内存和 CPU

2021-07-02 09:08:55 838

原创 为什么要用缓存

用缓存,主要有两个用途:高性能、高并发。高性能一个请求过来,操作 mysql,查出一个结果,耗时 600ms。但是这个结果可能接下来几个小时都不会变了,或者变了也可以不用立即反馈给用户。600ms 查出来的结果,放缓存里,一个 key 对应一个 value,下次再查,直接从缓存里,通过一个 key 查出来一个 value,2ms。性能提升 300 倍。就是说对于一些需要复杂操作耗时查出来的结果,且确定后面不怎么变化,但是有很多读请求,那么直接将查询出来的结果放在缓存中,后面直接读缓存就好。高并发

2021-07-01 20:56:07 479

原创 并发容器的使用:识别不同场景下最优容器

并发容器的使用:识别不同场景下最优容器并发场景下的 Map 容器假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况下,我们是用一个哈希表来存储商品和销量键值对,然后使用排序获得销量前十的商品。在这里,哈希表是实现该功能的关键。那么请思考一下,如果要你设计这个功能,你会使用哪个容器呢?切忌在并发场景下使用 HashMap。因为在 JDK1.7 之前,在并发场景下使用 HashMap 会出现死循环,从而导致 CPU 使用率居高不下,而扩容是导致死循环的主要原因。虽然 J

2021-06-22 23:50:44 143

原创 如何优化多线程上下文切换?

如果是单个线程,在CPU 调用之后,那么它基本上是不会被调度出去的。如果可运行的线程数远大于 CPU 数量,那么操作系统最终会将某个正在运行的线程调度出来,从而使其它线程能够使用 CPU,这就会导致上下文切换。在多线程中如果使用了竞争锁,当线程由于等待竞争锁而被阻塞时,JVM 通常会将这个锁挂起,并允许它被交换出去。如果频繁地发生阻塞,CPU 密集型的程序就会发生更多的上下文切换。在某些场景下使用多线程是非常必要的,但多线程编程给系统带来了上下文切换,从而增加的性能开销也是实打实存在的。那么我们该如何

2021-06-07 09:08:32 376

原创 ES在数据量很大的情况下(数十亿级别)如何提高查询效率

​ES 性能优化没有什么银弹,不要期待调一个参数,可以应对所有的性能慢的场景。ES性能优化的杀手锏——filesystem cache向 es 里写的数据,写到磁盘文件里去了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到filesystem cache里面。ES的搜索引擎依赖于底层的filesystem cache,如果给filesystem cache更多的内存,尽量让内存可以容纳所有的idx segment file索引数据文件,那么搜索的时候是走内存的,性...

2021-06-02 09:21:48 1557

原创 哪些操作导致了上下文切换

在并发程序中,并不是启动更多的线程就能让程序最大限度地并发执行。线程数量设置太 小,会导致程序不能充分地利用系统资源;线程数量设置太大,又可能带来资源的过度竞争,导致上下文切换带来额外的系统开销。初识上下文切换其实在单个处理器的时期,操作系统就能处理多线程并发任务。处理器给每个线程分配 CPU 时间片(Time Slice),线程在分配获得的时间片内执行任务。CPU 时间片是 CPU 分配给每个线程执行的时间段,一般为几十毫秒。在这么短的时间内线程互相切换,根本感觉不到,所以看上去就好像是同时进

2021-06-01 09:13:46 744

原创 使用乐观锁优化并行操作

Synchronized 和 Lock 实现的同步锁机制,这两种同步锁都属于悲观锁,是保护线程安全最直观的方式。悲观锁在高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。乐观锁的优化方法,看看怎么使用才能发挥它最大的价值。什么是乐观锁乐观锁,就是说在操作共享资源时,它总是抱着乐观的态度进行,它认为自己可以成功地完成操作。但实际上,当多个线程同时操作一个共享资源时,只有一个线程会成功,那么失败的线程呢?它们不会像悲观锁一样在操作系统中挂起,而仅仅是返回,并

2021-05-10 09:06:11 101

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除