- 博客(39)
- 收藏
- 关注
原创 spring是如何解决循环依赖的(二级缓存不行吗)?
首先我们要知道什么是循环依赖,在 Spring 中,循环依赖指的是两个或多个 Bean 之间相互引用(如 A 依赖 B,B 又依赖 A)。看起来像死锁一样是吧。Spring 通过三级缓存机制解决了单例 Bean 之间的循环依赖问题。通过三级缓存,存储不同的bean示例,通过提前暴露未完全初始化的bean 打破循环,流程如下:初始化 AA 依赖 B,触发 B 的初始化获取 A 的早期实例完成 A 的初始化
2025-10-22 19:08:31
497
原创 JS&TS ,JSX&TSX的区别与联系(前端react第一篇)
JS 与 TS:TS 是 JS 的增强版(加类型),TS 最终编译为 JS 运行。JSX 与 TSX:都是 JS/TS 的语法扩展(支持 XML 标签),区别在于 TSX 额外支持 TS 的类型检查。应用场景小型项目 / 快速原型:JS + JSX 更轻量。大型项目 / 团队协作:TS + TSX 更可靠(类型约束减少错误)。简单说:TS = JS + 类型TSX = JSX + 类型。
2025-10-21 17:46:53
531
原创 从0开始了解kafka《第二篇 kafka的安装、管理和配置》
我们要为 Kafka 选择合适的硬件时,优先考虑存储,包括存储的大小,然后考虑生产者的性能(也就是磁盘的吞吐量),选好存储以后,再来选择CPU 和内存就容易得多。网络的选择要根据业务上的情况来定,也是非常重要的一环。t=P7R7kafka下载https://kafka.apache.org/downloads。
2025-10-15 18:01:08
962
原创 从0开始了解kafka《第一篇 kafka入门》原理篇
Kafka 不仅仅是一个消息中间件,同时它是一个流平台,这个平台上可以发布和订阅数据流(Kafka 的流,有一个单独的包Stream 的处理),并把他们保存起来,进行处理,这个是 Kafka 作者的设计理念。大数据领域,Kafka 还可以看成实时版的 Hadoop,但是还是有些区别,Hadoop 可以存储和定期处理大量的数据文件,往往以TB 计数,而Kafka 可以存储和持续处理大型的数据流。Hadoop 主要用在数据分析上,而 Kafka 因为低延迟,更适合于核心的业务应用上。
2025-10-11 16:57:14
897
原创 对于项目中,PO,DO,DTO,VO,BO 都代表什么意思?有什么用?
减少接口调用次数,隐藏内部数据结构,只传输必要数据。处理跨领域的业务逻辑,协调多个 DO 完成复杂业务。仅用于数据库交互(ORM 映射),不包含业务逻辑。适配前端页面展示,避免前端处理业务逻辑。封装业务规则和逻辑,是业务层的核心逻辑。
2025-10-10 10:26:09
224
原创 SSE是什么?SSE解决什么问题?在什么场景使用SSE?
SSE的本质是客户端和服务端建立一次持久化的HTTP连接,服务器通过这个连接持续向客户端“流式”发送结构化数据(格式为text/event-stream),客户端实时监听并解析这些数据,实现服务器主动推,客户端被 动收的实时通信。单向通信:仅支持服务器向客户端推送数据,客户端无法通过同一连接向服务器发送数据(若需客户端交互,需额外用 AJAX/HTTP 请求)。基于 HTTP:无需建立新的通信协议(如 WebSocket 的ws://
2025-10-02 22:49:20
1162
原创 什么是跨域?跨域怎么解决?跨域解决的是什么问题?
协议相同:如都是httphttps和不同源);域名相同:如都是a.coma.com和b.com不同源,a.com和sub.a.com也不同源,后者是子域名);端口相同:如都是默认的80(http)或443(https)(a.com:8080和a.com:80不同源)。只要有一个条件不满足,就属于 “不同域”,此时浏览器会触发同源策略限制,阻止跨域请求。
2025-10-01 23:37:54
985
原创 线程安全之《Sychronized的八锁案例》
本文通过8个案例分析了Java中synchronized关键字的用法:1)实例方法锁当前对象;2)静态方法锁类对象;3)普通方法不受锁影响;4)不同实例拥有不同锁;5)静态方法锁类对象与实例无关;6)静态方法和实例方法使用不同锁对象互不影响。关键结论:synchronized修饰实例方法锁this对象,修饰静态方法锁Class对象,同步代码块锁指定对象,不同锁对象的方法可并行执行。
2025-09-26 16:53:17
683
原创 简单示例演示:乐观锁实现之《版本号》
版本号机制通过为数据添加版本标识,每次更新时检查版本是否匹配来判断是否有并发冲突。使用postman等工具进行测试,发送两个请求同时,结果肯定是一个成功一个失败。2.创建一个controller。
2025-09-25 17:55:08
358
原创 Redis事务是什么样的?
Redis事务通过MULTI、EXEC、DISCARD和WATCH四个命令实现,具有原子性和隔离性但不支持回滚。事务执行流程包括开启、命令入队和执行三个阶段。通过WATCH命令实现乐观锁机制,适用于读多写少场景。Java示例展示了基本事务操作和WATCH监视实现,演示了事务执行成功和被中断的场景。Redis事务能确保命令要么全部执行要么全部不执行,但执行失败时不会回滚已执行的命令。
2025-09-25 11:14:49
573
原创 线程安全之(锁)?第三篇
1. ReentrantLock可以实现公平锁和非公平锁2. ReentrantLock默认实现的是非公平锁3. ReentrantLock的获取锁和释放锁必须成对出现,锁了几次,也要释放几次4. 释放锁的操作必须放在finally中执行5. lockInterruptibly()实例方法可以相应线程的中断方法,调用线程的interrupt()方法时, lockInterruptibly()方法会触发 InterruptedException 异常。
2025-09-24 11:55:16
704
原创 Redis存储对象选择String还是Hash呢?怎么选择?
简单对象且不常更新:优先考虑 String复杂对象且需要频繁更新部分字段:优先考虑 Hash如果需要对整个对象设置过期时间:选择 String 更方便如果需要对字段进行原子操作:必须选择 Hash内存敏感场景:Hash 通常更节省空间在实际应用中,也可以根据具体需求混合使用两种方式,例如核心字段用 Hash 存储方便更新,而大文本等字段单独用 String 存储。
2025-09-22 17:28:17
350
原创 分库分表后ID冲突怎么解决?分布式ID生成方案。保证ID全局唯一性。
在分库分表场景中,由于数据库的数据被拆分到独立数据库或者独立的表,原本单库单表的自增ID() 会因为多个表独立而导致ID全局唯一性冲突。解决这一问题的核心是实现和一些其他特性()的分布式ID。
2025-09-22 15:04:42
1155
原创 Java中的锁机制,通过一个故事来讲解一下各种锁的关系和区别。《并发王国》
在一个名为 “并发王国” 的地方,有一座珍贵的 “共享图书馆”,里面存放着王国最核心的知识典籍(共享资源)。为了保护典籍不被混乱翻阅和涂改,历任图书管理员发明了各种 “借阅规则”—— 这些规则,就是 Java 中的各种锁。图书馆刚建成时,来借书的人很少。管理员发明了第一套规则:“登记本” 制度(对应关键字)。偏向锁:熟人免登记最初,每天只有村民小 A 来借书。管理员发现:每次都让小 A 登记太麻烦。于是规定:“只要小 A 来,直接把书给他,登记本上默认写他的名字。”这就是偏向锁的逻辑:当只有一个线程访问共享
2025-09-19 09:58:59
667
原创 线程安全之(如何解决线程不安全)?第二篇,超详细
本文系统介绍了Java中解决线程安全问题的三种核心技术:ThreadLocal、volatile和原子类。ThreadLocal通过线程隔离实现数据安全,适用于数据库连接、会话管理等场景,但需注意内存泄漏问题;volatile保证变量可见性和有序性,适合状态标记等简单同步场景;原子类则基于CAS机制实现无锁线程安全,性能优于同步锁,包括基本类型、数组、引用等多种原子类,并介绍了LongAdder等高并发优化方案。三者各有适用场景,开发者应根据具体需求选择合适方案来平衡线程安全与性能。
2025-09-18 15:32:44
1202
原创 Java 中如何利用 CAS 实现原子操作?以AtomicInteger 为例
AtomicInteger是Java中基于CAS机制实现原子操作的典型类。其核心原理是通过Unsafe类操作volatile int变量value,利用内存偏移量直接进行CAS操作。主要方法如getAndIncrement、compareAndSet等都采用"循环+CAS"模式,由CPU指令保证原子性。CAS的优势在于无锁开销和硬件级原子性,但存在ABA问题和高并发下的自旋开销。AtomicInteger通过volatile保证可见性,结合Unsafe的CAS操作实现线程安全的原子更新。
2025-09-18 15:17:32
586
原创 关于CAS的ABA问题的原因以及解决?
ABA问题及其解决方案 ABA问题是并发编程中CAS机制的一个逻辑漏洞,指一个值从A变为B后又改回A,导致CAS误判"值未变"(实际已被修改)。典型场景如链表操作,可能引发数据损坏。 解决方法: 版本控制:使用AtomicStampedReference,通过版本号标记每次修改,CAS时同时校验值和版本号。 标记位:AtomicMarkableReference用布尔标记记录修改状态,适用于简单场景。 核心思路是增加状态追踪,避免仅依赖值的比较。
2025-09-17 19:33:34
755
原创 线程安全之(什么是线程安全)?第一篇
摘要: 线程安全指多线程环境下共享资源的正确访问,需满足原子性、可见性和有序性。原子性确保操作不可分割(如基本类型赋值),可通过锁或synchronized实现;可见性保证变量修改即时可见,volatile强制刷新主存;有序性防止指令重排导致逻辑错误,volatile和synchronized能约束重排序。Java内存模型通过happens-before原则(如锁规则、volatile规则)定义操作间的逻辑依赖,底层依赖内存屏障和缓存同步机制。实际开发中,合理使用volatile、锁及final可确保并发安
2025-09-15 15:27:35
952
原创 数据库事务有哪些?数据库是怎么保证事务的?底层由什么实现?
摘要:数据库事务通过ACID特性(原子性、一致性、隔离性、持久性)确保数据可靠性。隔离级别(读未提交、读已提交、可重复读、串行化)平衡并发性能与数据一致性。底层实现依赖事务日志(WAL)、锁机制和MVCC技术:WAL保障原子性和持久性;锁机制控制并发访问;MVCC实现读写分离。实践建议包括合理选择隔离级别、控制事务粒度、显式处理异常和避免死锁。不同数据库对ACID的实现存在差异,需根据业务需求选择合适方案。事务管理是数据库可靠运行的核心机制。
2025-09-15 10:10:12
1040
原创 线程池的优势?
线程池是业务场景中必不可少的,主要用的就是ThreadPoolExcutors创建线程池,其中的参数是至关重要的.参数介绍可以查看我以往的文章;创建线程,线程池的参数介绍要想合理的配置线程池,需要先分析任务的特性,可以从以下几个角度分析:任务的性质:CPU密集型任务、IO密集型任务和混合型任务。任务的优先级:高、中、低。任务的执行时间:长、中、短。任务的依赖性:是否依赖其他的系统资源,如数据库连接。性质不同任务可以用不同规模的线程池分开处理。CPU密集型任务应该尽可能小的线程,如配置。
2025-09-11 15:32:20
817
原创 如果有亿级数据量怎么进行高效查询及存储?每日也会有千万新增怎么处理?
如何高效存储几十亿数据?如何让用户在毫秒级定位订单?每日千万订单带来的高QPS如何处理。
2025-09-11 14:24:58
376
原创 对配置文件数据库敏感数据加密!
这时候可以发现问题:写在配置文件中的密钥不管谁拿到都基本可以破解,所以要么把密钥写在项目启动参数,或者写在环境变量中。使用测试生成结果后就可以删除测试类。加密算法默认为PBEWithMD5AndDES。-- Jasypt加密库 -->想要将敏感数据加密变成这样,而且能正常运行怎么做呢?测试没问题,可以把配置文件中的密钥配置删除。简单进行测试当前保证当前数据库连接成功。即可访问环境变量中的密钥。
2025-09-11 09:24:25
200
原创 如何解决hash冲突?有几种方法,优缺点是什么?
哈希冲突是指不同键通过哈希函数计算得到相同哈希值,映射到哈希表同一位置的情况。主要原因在于哈希函数将无限输入映射到有限输出范围。解决方法包括:1)开放寻址法(线性探测、二分探测等)通过探测空位存储;2)链地址法(如HashMap)使用数组+链表/红黑树结构;3)再哈希法更换哈希函数;4)建立公共溢出区。不同方法各有优劣:开放寻址法内存效率高但存在聚集效应,链地址法实现简单但需额外空间。实际应用中需根据场景需求选择合适策略,如内存敏感选用开放寻址法,频繁删除则适合链地址法。
2025-09-10 14:55:34
978
原创 为什么重写了equals方法后必须重写hashcode方法?
Java中equals()和hashCode()必须同时重写。hashCode()需遵守三大原则:1)对象不变时hashCode一致;2)equals相同的对象hashCode必须相同;3)hashCode相同对象不一定equals相同。仅重写equals()会导致哈希集合失效,因为默认hashCode()基于内存地址。重写时应使hashCode()与equals()判断依据一致,选择合适字段减少哈希碰撞,并避免使用可变字段。
2025-09-10 11:05:29
430
原创 普通线程和守护线程的区别?
Java中的守护线程和普通线程核心区别在于线程生命周期与JVM退出机制。JVM仅关注普通线程存活状态,守护线程不影响JVM退出。普通线程用于必须完成的核心任务(如文件读写、请求处理),守护线程用于可中断的辅助服务(如日志记录、内存监控)。代码示例展示了普通线程执行3次后终止,而守护线程在普通线程结束后被强制终止。守护线程需在start()前设置,服务于普通线程,当普通线程结束时其存在的意义即消失。
2025-09-08 16:37:00
624
原创 线程的JNI层和JVM的本地方法栈的联系!
当 Java 线程通过 JNI 调用操作系统 API 时,所有 Native 方法的执行(包括参数传递、函数调用、返回值处理)都在本地方法栈中完成。它是 Java 代码与操作系统交互的。
2025-09-08 11:49:50
849
原创 线程常用方法有哪些?干什么用的?这些方法底层是怎么实现的?
Java 代码调用时,实际调用的是类中的方法,其源码如下:核心是调用了,这是一个被关键字修饰的方法,表明其实现由 Native 层提供。在 JVM 源码中通过 JNI 注册与 C/C++ 函数绑定。是 JVM 内部实现的 C 函数,其核心逻辑是调用操作系统的线程创建 API:操作系统接收到线程创建请求后,会完成以下工作:除了,其他线程方法的 Native 实现也遵循类似逻辑,直接依赖操作系统 API:线程的核心执行方法,包括任务执行逻辑。直接调用run() 不会创建新的线程,而是作为普通方法在当前线程执行。
2025-09-05 17:38:34
817
原创 如何创建线程,创建线程的方法有几种?有什么区别?
线程池核心参数核心线程数始终保持的线程数量最大线程数线程池允许的最大线程数量空闲时间非核心线程的空闲存活时间unit时间单位workQueue阻塞队列用于存储等待执行的任务创建工厂(可选)handler拒绝策略当线程和队列都满时的处理方式任务队列任务队列特点特性适用场景基于数组的有界阻塞队列,创建时必须指定容量FIFO(先进先出),队列满时会阻塞插入操作需要控制队列大小基于链表的阻塞队列,可指定容量(有界)或不指定(默认无界,容量为 Integer.MAX_VALUE)
2025-09-04 17:51:16
890
原创 了解CPU核心数和线程数的关系,上下文切换(Context switch)以及并行,并发,串行的区别
定义:当 CPU 从执行 “线程 A” 切换到执行 “线程 B” 时,需要先保存 “线程 A” 的当前执行状态(称为 “上下文”),再加载 “线程 B” 的上下文,最后开始执行线程 B 的过程。简单说:就是 CPU“记住线程 A 做到哪了,再切换到线程 B 继续做”。“上下文” 包含什么?寄存器数据:线程执行时的临时数据(如计算结果、变量值);程序计数器(PC):记录线程下一条要执行的指令地址;内存映射:线程对应的内存空间(如栈、堆的地址);内核状态:如线程的优先级、是否等待 IO 等。
2025-09-01 12:06:47
1612
原创 为什么了解JUC编程,并发编程有什么用以及进程-线程-协程的关系?
线程是操作系统中的基本执行单元(能够直接执行的最小代码块),它是进程中的一个实 体,是CPU调度和分派的基本单位。一个进程可以包含多个线程,每个线程都可以独立执行不同的任 务,但它们共享进程的资源。同一时刻,一个CPU核心只能运行一个线程,也就是CPU内核和同时运行的线程数是1:1的关系, 也就是说8核CPU同时可以执行8个线程的代码。可以在一个线程内部创建多个协程,协程之间可以共享一个线程的资源。协程是在同一个进程内部运行的,不需要操作系统的介入,可以在用户空间内实现协作多任务处理。
2025-08-28 17:16:38
292
原创 项目中CorsConfiguration 中的跨域配置可能不会生效。
注意:如果继承了 WebMvcConfigurationSupport,Spring Boot 默认的 MVC 配置会被禁用。因此,CorsConfiguration 中的跨域配置可能不会生效。如果不需要完全接管 Spring MVC 的配置,建议不要继承 WebMvcConfigurationSupport,而是使用 WebMvcConfigurer。如果项目中同时存在多个 WebMvcConfigurer 或继承了 WebMvcConfigurationSupport 的类,可能会导致配置覆盖或冲突。
2025-04-23 19:21:16
533
原创 RuoYi-vue分离式配置教程,包括(Mysql,node,redis,maven的下载和安装)
是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、通知公告、代码生成等。在线定时任务配置,支持集群,支持多数据源,支持分布式事务等。代码下载系统要求:JDK的下载可以看IDEA安装及JDK配置完整教程-优快云博客。
2025-04-20 18:05:02
913
原创 IDEA安装及JDK配置完整教程
IntelliJ IDEA 是一款由 JetBrains 公司开发的集成开发环境(IDE),专为 Java 编程语言设计,但也支持其他多种语言。它被广泛认为是业界最优秀的 Java 开发工具之一,特别是在智能代码助手、代码自动提示、重构、JavaEE 支持、版本控制工具(如 Git、SVN 等)、JUnit、CVS 整合、代码分析和创新的 GUI 设计等方面表现出色。
2025-04-20 14:20:36
5109
原创 JWT令牌技术,实现登录
不推荐在payload中记录任何敏感数据。signature:签名信息。这是一个由开发者提供的信息。是服务器验证的传递的数据是否有效安全的标准。在生成JWT最终数据的之前。先使用header中定义的加密算法,将header和payload进行加密,并使用点进行连接。如:加密后的head加密后的payload。再使用相同的加密算法,对加密后的数据和签名信息进行加密。得到最终结果。
2025-04-19 14:14:21
2103
原创 关于Mybatis想要查询带聚合函数的字段
聚合函数只能在having后进行过滤,一个查询只能包含一个having过滤,需要在group by分组后进行过滤(<select> 标签中不支持 <having> 标签。
2025-04-17 01:27:44
207
原创 生成验证码图片报错No primary or single unique constructor found for interface javax.servlet.http.HttpServletR
GetMapping("你的路径")可以先运行postman测试接口,如果报错。创建一个配置类KaptchaConfig。,就将导入的包前缀换成jakarta。解决后就可以在前端请求接口……创建controller。
2024-12-12 15:09:44
1054
原创 解决linux部署的redis 无法连接到another redis desktop manager。前提是在linux上连接redis正常。
重新开启防火墙(systemctl restart firewalld)
2024-10-14 19:53:15
504
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅