- 博客(63)
- 收藏
- 关注
原创 Java类加载器的原理及应用
classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。了解java的类加载机制,可以快速解决运行时的各种加载问题并快速定位其背后的本质原因,也是解决疑难杂症的利器。因此学好类加载原理也至关重要。
2025-04-23 21:46:39
795
原创 CompletableFuture介绍及使用
虽然Future也解决了 Runnable 的 “三无” 短板,但是它自身还是有短板:不能手动完成计算假设你使用 Future 运行子线程调用远程 API 来获取某款产品的最新价格,服务器由于洪灾宕机了,此时如果你想手动结束计算,而是想返回上次缓存中的价格,这是 Future 做不到的调用 get() 方法会阻塞程序Future 不会通知你它的完成,它提供了一个get()方法,程序调用该方法会阻塞直到结果可用为止,没有办法利用回调函数附加到Future,并在Future的结果可用时自动调用它。
2025-04-16 19:29:49
699
原创 java中的动态代理(jdk和Cglib)
拓展性:要是考虑使用角度Cglib无疑是更好的,因为JDK只能代理接口原理:JDK代理是利用反射机制生成匿名类,调用也是通过反射来调用 Cglib是采用字节码技术,通过修改字节码生成子类效率:JDK创建对象效率较高,但执行较慢,Cglib创建对象效率低,但执行较快局限性: Cglib需要额外导入第三方包,而Jdk代理不需要,但JDK局限于代理接口到底用什么相信大家有选择了,如果没特殊需求,就直接JDK得了,有特殊需求不用Cglib,JDK能满足吗?
2025-04-15 20:50:26
958
原创 java中常用的集合 - 面试篇
都应该知道HashMap 的结构是数组+链表,链表会在一定条件下树化变成红黑树(本节我们只追究常规操作,不深究红黑树这种数据结构),结构如下图所示我们可以看到初始化的时候传的参数是初始容量大小和扩容因子,为什么在初始化的时候并没看看数组容量的初始化,反而把数组容量赋值给了扩容阈值,阈值还没*扩容因子?为什么数组容量的初始化要做2的n次方处理?其实我们在了解HashMap的结构后,已经猜得到添加操作需要做什么了源码如下:四、resize 扩容机制HashMap的扩容与正常的数组扩容没啥区别都是要新建一个
2025-04-14 20:03:44
968
原创 深入理解java中的ConcurrentHashmap
好了核心操作基本都结束了,对了,还有个remove操作(这里就不贴了,理解完上面的在自己去看看吧,会发现哇原来这么简单),我觉得也没啥好总结的,综合来说使用了volatile+synchronized+CAS+自旋保证了线程安全,synchronized锁的细粒度+分槽位可协助扩容+ 计数器特殊处理极大程度的保证了性能的提升1.ConcurrentHashMap是怎么判断正在扩容中的?2.扩容期间在未迁移到的槽位中插入数据会发生什么?3.为什么get操作不需要加锁?
2025-04-14 11:25:40
901
原创 深入理解CAS与AQS
AQS是什么?全称是翻译过来就是抽象的队列式同步器,是一个抽象类,可以说是JUC包里面的核心,为啥平时开发没用过呢?因为这个是一个多线程访问共享资源的同步器框架,当然不能直接用了,但他的其他实现类你们一定很熟,等等先尝试获取资源,成功则直接返回没获取到资源就要进队等待,于是要加入队尾然后就进行自旋,进入等待状态前先尝试获取一下资源,获取不到则检查及设置前驱状态,然后再进入等待状态休息等待时被unpark()唤醒或者被interrupt()中断,就继续步骤3,直到获取到资源。
2025-04-13 15:25:52
1026
原创 volatile和synchronized介绍
可能很多人搞不清楚什么是可见性,只能单纯的从字面意思去理解,下面通过一个例子带大家深刻理解一下例子很简单,两个线程一个线程等待变量改变才结束否则就死循环,另一个线程去改变变量flag=false;System.out.println("还没变");// flag不改变 就一直死循环直至发现值改变System.out.println("我感知到变化了");}).start();try {//等待1s才执行下一个线程setFlag();System.out.println("我修改了")
2025-04-10 19:03:24
999
原创 java中String、StringBuffer、StringBuilder的区别和联系
都是用于处理字符串的类,但它们在性能、线程安全和适用场景上有显著区别。频繁修改会导致大量临时对象,降低性能(尤其是循环操作时)。对象一旦创建,其内容不可修改。所有看似修改的操作(如。减少扩容次数(默认容量为 16,扩容代价高)。由于同步锁,单线程环境下性能低于。修饰,保证多线程环境下的安全。即使性能略低,但能避免并发问题。),修改时直接在原对象上操作。方法未加锁,适用于单线程环境。不可变性天然保证线程安全。类似,基于可变字符数组。在单线程环境下,性能比。内部维护可变字符数组(
2025-04-01 10:53:28
604
原创 java中为什么需要同时重写 equals 和 hashCode
这是为了确保对象在哈希表中行为一致,并遵守 Java 的相等性契约。忽略这一点会导致程序出现隐蔽的逻辑错误,尤其在依赖哈希结构的场景下。,这是为了确保对象在哈希表中行为一致,并遵守 Java 的相等性契约。忽略这一点会导致程序出现隐蔽的逻辑错误,尤其在依赖哈希结构的场景下。如果违反这一规则,对象在使用哈希表(如。如果违反这一规则,对象在使用哈希表(如。方法,这是因为两者共同维护了对象的。方法的类通常也需要重写。)时会出现逻辑错误。)时会出现逻辑错误。
2025-04-01 10:42:56
939
原创 什么是动态代理?动态代理和静态代理的区别
静态代理适合简单场景,但代码冗余。动态代理通过反射或字节码技术动态生成代理类,灵活且高效。JDK 动态代理基于接口,CGLIB基于继承,根据需求选择合适方式。
2025-03-31 21:28:07
970
原创 什么是索引下推和索引覆盖?
核心思想:在存储引擎层(如 InnoDB)提前过滤数据,减少不必要的回表操作。通俗解释:假设你有一个联合索引,查询时部分条件可以直接在索引层过滤掉不符合条件的记录,而不是把数据全部交给 MySQL 服务层再过滤。核心思想:查询所需的所有列都包含在索引中,无需回表查询主键索引。通俗解释:就像查字典时,你要查的单词和解释都在目录里,不需要翻到正文页。比喻:快递分拣员在仓库里直接扔掉不符合条件的包裹(如收件地址错误),而不是把所有包裹送到分拣中心再处理。核心。
2025-03-28 20:44:11
962
原创 什么是CAP理论
CAP理论是分布式系统设计中的核心理论之一,由计算机科学家Eric Brewer在2000年提出,后经Nancy Lynch等人证明。它阐述了分布式系统在面临网络分区时必须在三个关键特性之间做出权衡。提出,指出在分布式系统中,
2025-03-25 09:13:55
994
原创 mysql进阶(innodb、索引、类型、权限)
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。InnoDB 的指针占用6个字节的空间,主键假设为bigint,占用字节数为8.
2025-03-20 14:37:54
1139
原创 mysql基础(超详细)
mysql基础入门DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
2025-03-20 14:32:02
778
原创 网络编程中的黏包和半包问题
在网络编程中,黏包和半包问题是常见的数据传输问题,尤其是在使用TCP协议时。Netty作为一个高性能的网络框架,提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题,以及Netty中如何处理它们。如果上述解码器无法满足需求,Netty还允许用户自定义解码器。用户可以继承或来实现自己的解码逻辑。@Override// 自定义解码逻辑黏包和半包问题是TCP协议中常见的数据传输问题,Netty提供了多种解码器来处理这些问题。
2025-03-19 16:31:14
644
原创 springboot中@PostConstruct注解使用详解
是 Spring 中用于在 Bean 初始化完成后执行一些初始化逻辑的注解。它通常用于在依赖注入完成后执行一些必要的初始化操作,如资源加载、配置初始化等。相比于其他初始化方式,更加简洁直观,推荐在大多数场景下使用。
2025-03-19 16:30:00
1156
原创 在文件夹下快速创建vue项目搭建vue框架详细步骤
说明你使用的是老的淘宝镜像:registry.npm.taobao.org 后竟然出现证书过期,网上一搜才知道原来的 registry.npm.taobao.org 已替换为 registry.npmmirror.com 地址了,并且看了很多类似报错发现使用的还是老地址。回车后勾选以上3个选项(空格键勾选),并取消勾选Linter(对语法很严格)这个选项,回车。先执行cd springboot_vue 进入该目录,执行dir可以查看该目录。输入yes后选择In package.json的打包方式。
2025-03-19 16:28:14
606
原创 mysql索引
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。算出n约为1170。联合索引中,出现范围查询(<, >),范围查询右侧的列索引失效。
2025-03-06 15:15:57
651
原创 MySql详细教程-从入门到进阶(超实用)
- DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)- DML: 数据操作语言,用来对数据库表中的数据进行增删改- DQL: 数据查询语言,用来查询数据库中表的记录- DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
2024-12-26 20:36:57
1452
原创 mysql进阶
当字段类型为字符串(varchar, text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO,影响查询效率,此时可以只降字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。前缀长度:可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。InnoDB 的指针占用6个字节的空间,主键假设为bigint,占用字节数为8.
2024-12-26 20:31:35
900
原创 mysql基础快速入门
mysql基础快速入门- DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)- DML: 数据操作语言,用来对数据库表中的数据进行增删改- DQL: 数据查询语言,用来查询数据库中表的记录- DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限
2024-12-26 20:26:24
1082
原创 SpringBoot 中的 AOP 切面编程
切面是 AOP 的核心概念,它包含了通知(Advice)和切点(Pointcut)。通知定义了在切点执行的逻辑,而切点定义了在哪些地方应用通知。切点定义了在哪些方法上应用通知。可以使用@Pointcut// 定义一个切点,匹配所有以 "find" 开头的方法 @Pointcut("execution(* com.example.demo.service.*.find*(..))") public void findMethods() {} }
2024-12-23 17:19:31
1229
原创 SpringBoot中使用AOP切面编程实现登录拦截
以上提供的示例代码逻辑大致为用户登录后根据UUID生成一个token,接着将token作为唯一标识键存入redis缓存中,值为用户id,之后可以根据用户请求头中的token去redis中获取用户id,当然你也可以根据自己的实际需求来。
2024-12-23 17:03:04
692
原创 netty高级-优化与源码
注意发送的数据未必能够一次读完,因此会触发多次 nio read 事件,一次事件内会触发多次 pipeline read,一次事件会触发一次 pipeline read complete。SO_TIMEOUT 主要用在阻塞 IO,阻塞 IO 中 accept,read 等都是无限等待的,如果不希望永远阻塞,使用它调整超时时间。在 linux 2.2 之前,backlog 大小包括了两个队列的大小,在 2.2 之后,分别用下面两个参数来控制。主要任务是执行死循环,不断看有没有新任务,有没有 IO 事件。
2024-12-22 18:04:57
909
原创 springboot中@PostConstruct注解使用详解
是 Spring 中用于在 Bean 初始化完成后执行一些初始化逻辑的注解。它通常用于在依赖注入完成后执行一些必要的初始化操作,如资源加载、配置初始化等。相比于其他初始化方式,更加简洁直观,推荐在大多数场景下使用。
2024-12-22 16:31:06
1906
原创 网络编程中的黏包和半包问题
在网络编程中,黏包和半包问题是常见的数据传输问题,尤其是在使用TCP协议时。Netty作为一个高性能的网络框架,提供了多种解决方案来处理这些问题。下面我将详细解释黏包和半包问题,以及Netty中如何处理它们。如果上述解码器无法满足需求,Netty还允许用户自定义解码器。用户可以继承或来实现自己的解码逻辑。@Override// 自定义解码逻辑黏包和半包问题是TCP协议中常见的数据传输问题,Netty提供了多种解码器来处理这些问题。
2024-12-17 19:15:19
1122
原创 netty进阶以及基于netty聊天室demo案例
魔数,用来在第一时间判定是否是无效数据包版本号,可以支持协议的升级序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型,是登录、注册、单聊、群聊… 跟业务相关请求序号,为了双工通信,提供异步能力正文长度消息正文/*** 用户管理接口/*** 登录* @param username 用户名* @param password 密码* @return 登录成功返回 true, 否则返回 false。
2024-12-17 19:08:05
1066
原创 Netty入门教程——认识Netty
我们知道,Java的内存有堆内存、栈内存和字符串常量池等等,其中堆内存是占用内存空间最大的一块,也是Java对象存放的地方,一般我们的数据如果需要从IO读取到堆内存,中间需要经过Socket缓冲区,也就是说一个数据会被拷贝两次才能到达他的的终点,如果数据量大,就会造成不必要的资源浪费。NIO和BIO的区别主要是在第一步。多路复用IO,他的两个步骤处理是分开的,也就是说,一个连接可能他的数据接收是线程a完成的,数据处理是线程b完成的,他比BIO能处理更多请求。原因就是图二中出现的。
2024-12-06 19:55:10
1315
原创 Netty入门(快速了解以及使用netty)
Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位以下的框架都使用了 Netty,因为它们有网络通信需求!Cassandra - nosql 数据库 Spark - 大数据分布式计算框架 Hadoop - 大数据分布式存储框架 RocketMQ - ali 开源的消息队列 ElasticSearch - 搜索引擎 gRPC
2024-12-06 19:51:00
5362
4
原创 java NIO(non-blocking io 非阻塞 IO)知识精讲
non-blocking io 非阻塞 IOchannel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层channelbuffer常见的 Channel 有buffer 则用来缓冲读写数据,常见的 buffer 有selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途socket1t
2024-11-29 19:33:33
2244
原创 github如何将前后端代码以及其他文件放进一个分支流程
通过以上步骤,你可以将前后端代码放在同一个GitHub分支中,并且可以通过目录结构来清晰地组织代码。这种方式适合小型项目或需要快速迭代的项目。对于大型项目,可能需要考虑使用多个分支或子模块来更好地管理代码。你可以使用GitHub Actions或其他CI/CD工具来设置自动化测试和部署流程。首先,在GitHub上创建一个新的仓库。你可以选择创建一个空的仓库,或者使用一个模板仓库。文件,描述项目的结构和如何运行前后端代码。在项目根目录下,你可以分别运行前端和后端代码。文件,忽略不需要的文件和目录(如。
2024-11-23 17:03:44
546
原创 初识netty-netty快速入门
WebSocket 是一种在客户端和服务器之间建立持久连接的协议,允许双向、全双工的通信,避免了传统 HTTP 请求响应模式的高开销。WebSocket 协议通过握手建立连接,在连接建立后,可以持续发送和接收数据,适合实时应用,如聊天、在线游戏、股票行情等。@Overridelogger.info("心跳超时");@Slf4j@Component/*** 用于处理每个传入的消息。
2024-11-19 09:41:58
4342
原创 2024最新将本地项目jar包发布上传到maven私服中央仓库以及踩坑记录(看这一篇就够了)-超详细
配置好maven后使用idea的maven工具进行deploy工作,这个时候回弹出让你输入gpg密码(只有第一次进行这个操作回有,后面就不需要输入密码了),只要输入你刚刚生成签名时设置的密码就行了。此处executable填写你的gpg文件路径,只需要修改F:\gpg\GnuPG这一段就好了,后面\bin\gpg.exe是一样的。此处name填写你的项目名,description填写的项目描述,url填写你的仓库地址就可以了。基本说明你的系统有问题,建议换一个用户登录,没有的可以以管理员身份注册一个用户。
2024-10-29 09:12:30
9911
4
原创 springboot中通过jwt令牌校验以及前端token请求头进行登录拦截实战
Slf4j@Autowired/*** 注册自定义拦截器*/log.info("开始注册自定义拦截器...");.addPathPatterns("/user/**") //表示拦截所以前缀带/user的请求//排除特定路径:excludePathPatterns("/user/login") 方法用于排除某些路径,//即使它们匹配前面指定的模式。在这个例子中,/user/login 路径不会被 jwtTokenAdminInterceptor 拦截。/*** 设置静态资源映射。
2024-07-10 15:45:51
4034
2
原创 RabbitMQ高级-rabbitMQ消息队列高级部分笔记
每个只能配置一个,因此我们可以在配置类中统一设置。我们在publisher模块定义一个配置类:内容如下:@Slf4j@Overridelog.error("触发return callback,");});由于每个消息发送时的处理逻辑不一定相同,因此ConfirmCallback需要在每次发消息时定义。具体来说,是在调用RabbitTemplate中的convertAndSend方法时,多传递一个参数:id。
2024-06-02 16:51:49
720
原创 RabbitMq消息队列最新笔记
多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列描述下Direct交换机与Fanout交换机的差异?Fanout交换机将消息路由给每一个与之绑定的队列Direct交换机根据RoutingKey判断路由给哪个队列。
2024-06-01 20:45:22
862
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人