自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 读spring @Async的源码让我收获了什么?

此外,使用线程池,我们也需要一个类去实现Runnable或Callable接口,然后将该类的实例提交到线程池中,如果该类实现的是Runnable接口,则在run方法中执行我们自己的业务逻辑,并且没有返回值,也获取不到异常信息。spring的开发者们考虑到异步是一种思想,不应该拘泥于实现Runnable接口或Callable接口,在run方法或call方法中实现业务逻辑,它将线程的创建细节封装起来,只需少许的注解,就可以实现异步的功能,让我们把更多时间花在业务方法上。那么,它的底层是如何实现的呢?

2022-09-21 09:31:28 188 1

原创 spring解决循环依赖为什么要用三级缓存?

如果不用第二级缓存,这里会有问题,两次获取的a实例不一样。如果从earlySingletonObjects(二级缓存)中获取不对实例,则从singletonFactories(三级缓存)中获取singletonFactory,如果获取到则调用getObject方法创建实例,把创建好的实例放到earlySingletonObjects(二级缓存)中,并且从singletonFactories(三级缓存)删除singletonFactory实例,然后返回singletonObject实例。

2022-09-21 09:24:39 218

原创 spring事务的这10种坑,你稍不注意可能就会踩中!!!

我们可以看到事务方法add中,调用了事务方法doOtherThing,但是事务方法doOtherThing是在另外一个线程中调用的,这样会导致两个事务方法不在同一个线程中,获取到的数据库连接不一样,从而是两个不同的事务。这种情况使用了嵌套的内部事务,原本是希望调用roleService.doOtherThing方法时,如果出现了异常,只回滚doOtherThing方法里的内容,不回滚 userMapper.insertUser里的内容,即回滚保存点。所以,这种情况是直接回滚了整个事务,不只回滚单个保存点。

2022-09-21 09:21:39 197

原创 高并发场景中,数据库都有哪些优化手段?不会还有人不知道吧

MySQL主从复制是一个 异步 的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库(slave,即 从库 )从另一台MySQL数据库(master,即 主库 )进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是 MySQL数据库自带功能,无需借助第三方工具。二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。

2022-09-21 09:16:33 823

原创 谈谈Dubbo的那些事

它拥有功能强大的代码生成引擎,无缝地支持C + +,C#,Java,Python和PHP和Ruby。我们上边讲解的众多方法都只是针对于dubbo的客户端异步化,并没有讲解关于服务端的异步化处理,这是因为结合dubbo的业务线程池模型来思考,服务端的异步化处理比较鸡肋(因为dubbo内部服务端的线程池本身就是异步化调用的了)。在工作中,我们通常都会通过配置xml的方式来设定一个服务端暴露的服务接口和消费端需要调用的服务信息,这些配置的xml实际上在dubbo的源码中都会被解析为对应的实体类对象。

2022-09-20 16:35:34 169

原创 MySQL的基本体系和架构介绍

这里头说的客户端是指提供连接MySQL的工具集合,常见的客户端工具有mysql client,mysqladmin,mysqldump,mysqlcheck,mysqlimport,mysqlshow等等。但传统的套接字的用法都是基于TCP/IP协议栈的,需要指定IP地址。关于查询缓存的功能,在MySQL中是根据sql语句来做缓存检索的,默认情况下该缓存属性是关闭的,对于更新频率较高的表而言,设置查询缓存其实本身的命中率并不高,因此该功能MySQL也并不提倡使用,在MySQL8.0的时候该功能也被移除了。

2022-09-20 16:30:43 67

原创 全面解析大数据批处理框架Spring Batch,所谓完美解析方案是什么

但批处理领域的框架确凤毛麟角。Spring Batch框架提供了对文件分区的支持,实现类org.springframework.batch.core.partition.support.MultiResourcePartitioner提供了对文件分区的默认支持,根据文件名将不同的文件处理进行分区,提升处理的速度和效率,适合有大量小文件需要处理的场景。Step包含了一个实际运行的批处理任务中的所有必需的信息,其实现可以是非常简单的业务实现,也可以是非常复杂的业务处理,Step的复杂程度通常是业务决定的。

2022-09-20 16:21:51 1162

原创 【多线程与高并发】从一则招聘信息进入多线程的世界

什么是线程的上下文切换?多线程的上下文切换是指 CPU 控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取 CPU 执行权的线程的过程。

2022-09-20 16:08:29 163

原创 【死磕JVM】看完这篇我也会排查JVM内存过高了 就是玩儿!

CPU 是时分的,操作系统里面有很多线程,每个线程的运行时间由CPU决定,CPU会分给每一个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,就是100%,我们应该意识到,CPU运行速度很快(主频非常高),除非是密集型耗费CPU的运算,其他类型的任务都会在小于时间片的时间内结束。内存过高一般有两种情况:内存溢出和内存泄露程序分配的内存超过物理机的内存大小,导致无法继续分配内存,出现OOM报错。

2022-09-20 16:05:48 1492

原创 【死磕JVM】什么是JVM调优?

在没有接触过调优之前我们理解的JVM调优就是解决OOM问题,OOM只是JVM调优的一部分一般是根据需求进行JVM规划和预调优优化运行JVM运行环境(慢,卡顿)解决JVM运行过程中出现的各种问题(OOM)首先的话,调优是从业务场景开始的,如果没有业务场景的JVM调优都是不靠谱的,比如有时间在实际项目中,有很多个类,成千上万个代码,你怎么知道具体是哪个代码有问题,就算我们知道有段代码频繁的full gc,但是可能过一段时间就OOM了。

2022-09-20 16:01:21 107

原创 通过源码分析Mybatis是如何返回数据库生成的自增主键值?

在Mybatis中,执行insert操作时,如果我们希望返回数据库生成的自增主键值,那么就需要使用到KeyGenerator对象。需要注意的是,KeyGenerator的作用,是返回数据库生成的自增主键值,而不是生成数据库的自增主键值。返回的主键值放到哪儿呢?放到parameter object的主键属性上。下面看看其接口定义。接口定义还是比较简单的,就是在insert前、insert后,策略处理主键值。

2022-09-20 15:23:51 589

原创 还在百度Docker命令?推荐一套用起来特顺手的命令

Docker是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。使用Docker可以更方便地打包、测试以及部署应用程序。

2022-09-20 14:44:46 89

原创 基于 Spring Boot、Jpa、Security、Vue的前后端分离的后台管理系统

eladmin 是一款基于 Spring Boot 2.1.0 、 Jpa、 Spring Security、redis、Vue 的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持数据字典与数据权限管理,支持一键生成前后端代码,支持动态路由。其实项目网上有很多了,但是教程比较详细的没多少,今天分享的项目从安装部署到代码具体功能都有很详细都说明。eladmin-tools为第三方工具模块,包含:图床、邮件、云存储、本地存储、支付宝。

2022-09-20 14:29:47 196

原创 【java8】阿里架构师:Stream对集合的处理方式你全都知道了吗?

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。特点:元素是特定类型的对象,形成一个队列。Java中的Stream并不会存储元素,而是按需计算。流的来源。

2022-09-19 13:46:02 1776

原创 阿里巴巴Java开发手册阅读笔记

在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。【强制】使用集合转数组的方法,必须使用集合的 toArray(T[] array),传入的是类型完全一样的数组,大小就是 list.size()。

2022-09-19 10:33:09 229

原创 Java高并发编程:取消和关闭

对中断的正确理解是:它并不会真正地中断在一个正在运行的线程,而是发出中断请求,然后由线程在下一个合适的时刻中断自己。JVM不能保证这些线程的执行顺序。如果一个线程被调用Thread.interrupted()方法之后,如果它的状态是阻塞状态或者是等待状态,而且这个状态正是因为正在执行的wait、join、sleep线程造成的,那么是会改变运行的结果(抛出InterruptException异常)当线程在非阻塞状态下中断时,它的中断状态将被设置为true,然后根据将取消的操作来检查中断状态以判断发生了中断。

2022-09-19 10:23:07 254

原创 《码出高效-Java开发手册》走进JVM有感

若不存在,那么在双亲委派模式下,使用当前类加载器以ClassLoader +包名+类名为key 进行查找对应的.class 文件,如果没有找到文件,则抛出ClassNotFoundException 异常,如果找到,则进行类加载并生成对应的Class 类对象。JVM 中的虚拟机栈是描述Java方法执行的内存区域,它是线程私有的。在代码的执行过程中,JVM将字节码解释执行,屏蔽对底层操作系统的依赖,JVM 也可以将字节码编译执行,如果是热点代码,会通过JIT 动态地编译为机器码,提高执行效率。

2022-09-19 10:20:17 80

原创 SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页

本篇文章主要讲述的是SpringBoot整合Mybatis、Druid和PageHelper 并实现多数据源和分页。其中SpringBoot整合Mybatis这块,这里就不过多说明了。重点是讲述在多数据源下的如何配置使用Druid和PageHelper。在使用Druid之前,先来简单的了解下Druid。Druid是一个数据库连接池。Druid可以说是目前最好的数据库连接池!因其优秀的功能、性能和扩展性方面,深受开发人员的青睐。

2022-09-17 13:54:07 1230

原创 用Java从零写一个B2C商城,看完不要再说自己没有实战经验了!

要想立足于互联网公司,且能在互联网浪潮中不被淹没,对于项目的开发实战演练是不必可少的技能,也是对自身能力的一个衡量,有多少的量对等于获得多少的回报。看似简单的一个项目需求图谱,其中的底层原理,实现原理又能知道多少?你搭建一个完整的B2C项目平台到底需要多少知识?这一切都是需要我们考量的。

2022-09-17 13:28:24 635

原创 Kafka or RabbitMQ:消息中间件选型深入分析

衡量一款消息中间件是否符合需求需要从多个维度进行考察,首要的就是功能维度,这个直接决定了你能否最大程度上的实现开箱即用,进而缩短项目周期、降低成本等。如果一款消息中间件的功能达不到想要的功能,那么就需要进行二次开发,这样会增加项目的技术难度、复杂度以及增大项目周期等。1. 功能维度优先级队列优先级队列不同于先进先出队列,优先级高的消息具备优先被消费的特权,这样可以为下游提供不同消息级别的保证。

2022-09-17 13:23:34 342

原创 RabbitMQ的深入理解和最简单的用途说明

如上图, 寄件人P是系统的一个功能模块. 用来发送消息. 一般是在某些重要的业务状态变更时发送消息. 例如: 新订单产生时, 订单已打包时, 订单已出库时, 订单已发出时.而RabbitMQ的设计理念是.只要有接收消息的队列. 邮件就会存放到队列里. 直到订阅人取走. . 如果没有可以接收这个消息的消息队列. 默认是抛弃这个消息的..经过研究得出的结论是. MSMQ的设计理念不适合做系统的底层框架. 他不适合做分布式系统. 最主要的是. MSMQ如果没有消费者, 默认消息是一直存在的.

2022-09-16 10:07:21 77

原创 Nginx使用总结

tar zxvf nginx-1.2.9.tar.gz#解压nginxcdnginx-1.2.9#进入目录./configure--prefix=/opt/soft/nginx--with-http_stub_status_module--with-http_ssl_module--with-http_realip_module#配置安装模块make install#安装复制代码--prefix:指定安装目录,默认的安装目录是/usr/local/nginx;

2022-09-15 11:50:03 948

原创 Java 面试之技术框架

Spring 是一种用来简化企业级应用开发的开源框架,包括Spring Framework, Spring Data, Spring Security,Spring Boot,SpringMVC等。Spring 家族最核心的概念当属 AOP 和 IoC,详解见下节。其中 Spring 优点如下:降低了组件之间的耦合性 ,实现了软件各层之间的解耦可以使用便捷的众多服务,如事务管理,消息服务等容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能。

2022-09-15 11:02:26 84

原创 Mybatis工作流程及其原理与解析

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。本文将通过debug的方式来了解其工作原理。

2022-09-15 10:41:36 192

原创 和面试官面对面谈了半小时MySQL事务隔离性

当一个事务开启的时候,会向系统申请一个新事务id 此时,可能还有多个正在进行的其他事务没有提交,因此在瞬时时刻,是有多个活跃的未提交事务id 将这些未提交的事务id组成一个数组,数组里面最小的事务id记录为低水位,当前系统创建过的事务id的最大值+1记录为高水位 这个数组array 和 高水位,就组成了“一致性视图”。事务的隔离性要求每个事务读写的对象对其他事务都是相互隔离的,也就是这个事务提交前,这个事务的修改内容对其他事务都是不可见的。注意,不可重复读,主要是读到了别的事务update的内容。

2022-09-14 13:49:24 49

原创 单例模式的Java如何去实现?

本文分析了单例模式在 Java 里的不同实现方式,通过对比优劣最后提出结论。

2022-09-14 13:38:02 368

原创 Redis内部数据结构quicklist详解

在本文中,我们介绍一个Redis内部数据结构——quicklist。Redis对外暴露的list数据类型,它底层实现所依赖的内部数据结构就是quicklist。我们在讨论中还会涉及到两个Redis配置(在redis.conf中的ADVANCED CONFIG部分):我们在讨论中会详细解释这两个配置的含义。注:本文讨论的quicklist实现基于Redis源码的3.2分支。quicklist概述Redis对外暴露的上层list数据类型,经常被用作队列使用。

2022-09-14 13:24:24 287

原创 一种强大的MySQL索引—覆盖索引

当MySQL不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集(实际上就是外排序)InnoDB的二级索引在 叶子节点中保存了行的主键值,所以如果二级主键能够覆盖査询,则可以避免对主 键索引的二次査询。3、对于INNODB的辅助索引,它的叶子节点存储的是索引值和指向主键索引的位置,然后需要通过主键在查询表的字段值,所以辅助索引存储了主键的值。

2022-09-14 13:18:41 342

原创 MySQL的各大存储引擎

1.InnoDB:数据和索引存放在单独的文件,聚簇索引,行级锁,事务,MVCC2.MyISAM:(1)缺点:不支持事务和表级锁,因为不支持表锁,锁颗粒比较大,因此适合只读和小文件。(2)文件:数据文件和索引文件以.MYD和.MYI结尾。(3)压缩表:压缩表不能修改,可以减少磁盘占用,也可以减少磁盘I/O;支持索引,所以只读;记录单独存放,要去单行不需要解压整个表。

2022-09-14 13:13:25 802

原创 北京六天十次面试,已拿到offer,面试题和总结分享(Java岗)

前言:最近一朋友离了职,在北京前前后后面试了6天,一共10家公司,我找他分享出面试过程及经验,希望能对各位正在面试中或者准备面试的童鞋有所帮助,以下面试企业为了保密不说实际名称。以下为第一人称。第一家公司:简称A由于刚刚开始面试选择试试水,就在智联上投递了一写公司,这家就是第一个让我去面试的公司。这家企业是新三板上市的一家公司,大约有700人那样。面试时间定在早上10点,去了以后给了一份面试题内容如下:一、Spring1.请说明spring实现AOP的两种方式及其区别2.请说明Spring生命周期中的可扩展

2022-09-14 11:45:48 199

原创 27 道超经典 MyBatis 面试题(附带答案~)

它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;

2022-09-14 11:36:19 469

原创 面试官:讲一下Java的分区收集算法?

垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。在新生代回收之前,虚拟机首先会检查老年代的最大可用连续空间是否大于新生代对象的总空间,如果是的,那么就可以保证这次内存回收是安全的。如果允许失败,那么就不管够不够,还是启动新生代的垃圾回收,当回收失败时,就启动老年代的垃圾回收,然后再重新执行新生代的垃圾回收。

2022-09-14 11:08:48 56

转载 Spring Cloud 之 Stream 消息驱动详解

通过消息分组可以解决消息被重复消费的问题,但在某些场景下分组还不能满足我们的需求。比如,同时有多条同一个用户的数据发送过来,我们需要根据用户统计,但是消息被分散到了不同的集群节点上了,这时我们就可以考虑使用消息分区了。假设这 10 条消息都来自同一个用户,正确的方式应该都由一个消费者消费所有消息,否则系统肯定会出现问题。如果有多个消息消费者,那么消息生产者发送的消息会被多个消费者都接收到,这种情况在某些实际场景下是有很大问题的,比如在如下场景中,订单系统做集群部署,都会从。消息分区是对消息分组的一种补充。

2022-09-14 10:58:08 564

原创 一文读懂Spring Cloud底层原理

毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。实际上,Spring Cloud是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几个组件入手,来剖析一下其底层的工作原理。也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件。

2022-09-13 15:41:45 75

原创 Java 经典面试题:聊一聊 JUC 下的 LinkedBlockingQueue

本文聊一下 JUC 下的 LinkedBlockingQueue 队列,先说说 LinkedBlockingQueue 队列的特点,然后再从源码的角度聊一聊 LinkedBlockingQueue 的主要实现~

2022-09-13 15:33:03 202

原创 羽扇智Java实习面试(offer到手含面试经验及答案)

本科应届生,计算机科学专业,自己有幸拿到了网易雷火、京东、去哪儿、字节跳动、羽扇智等互联网公司的实习Offer,因为某些自身原因最终选择了羽扇智,所以来分享一下自己面经,希望对大家有帮助,从而少走一点弯路,同时也整理了相关面试题,大部分都是类似的,留在文末了。

2022-09-13 13:40:26 143

原创 从阿里跳槽来的工程师,连Spring容器与SpringMVC的容器的区别都不知道?

首先在我们开发中会与到各种各样的容器,今天我们就说一下spring 容器与springmvc容器。Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多web应用采用。但是在实际应用中,初级开发者常常会因对Spring和SpringMVC的配置失当导致一些奇怪的异常现象,比如Controller的方法无法拦截、Bean被多次加载等问题,这种情况发生的根本原因在于开发者对Spring容器和SpringMVC容器之间的关系了解不够深入。

2022-09-09 10:10:47 72

原创 一篇带你读懂MQ——MQ的原理、持久化以及使用场景总结

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

2022-09-08 17:05:16 6022

原创 Spring Boot 实现Redis分布式锁

本文主要讲解了Spring Boot集成Redis实现单机版本分布式锁,虽然单机版分布式锁存在锁的续期、锁的重入问题,但是我们还是需要掌握其原理和实现方法,如有疑问,请随时反馈,大家共同学习,共同进步。

2022-09-08 15:25:23 678

原创 死锁详解:常见死锁案例、条件,如何避免出现死锁?

死锁不仅在个人学习中,甚至在开发中也并不常见。但是一旦出现死锁,后果将非常严重。首先什么是死锁呢?打个比方,就好像有两个人打架,互相限制住了(锁住,抱住)彼此一样,互相动弹不得,而且互相欧气,你不松手我就不松手。好了谁也动弹不得。在多线程的环境下,势必会对资源进行抢夺。当两个线程锁住了当前资源,但都需要对方的资源才能进行下一步操作,这个时候两方就会一直等待对方的资源释放。这就形成了死锁。这些永远在互相等待的进程称为死锁进程。

2022-09-08 11:27:03 616

空空如也

空空如也

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

TA关注的人

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