自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式之责任链模式

责任链模式是一种行为设计模式,通过链式结构将请求在多个对象间传递,每个对象可选择处理或转发请求。该模式降低了发送者与处理者的耦合度,支持动态调整处理顺序,便于扩展和维护。典型应用场景如报销审批流程,不同金额的请求由不同层级处理。代码示例展示了经理、部门主管和财务部门三级审批的实现。优点是灵活性高、职责单一,但需注意请求无法处理或处理链过长的问题。该模式适用于需要动态确定请求处理者的场景。

2025-10-08 10:06:02 351

原创 设计模式之命令模式

命令模式是一种行为型设计模式,它将请求封装为独立对象,实现调用者和执行者的解耦。核心角色包括命令接口、具体命令、接收者、调用者和客户端。以遥控器控制灯为例,调用者触发命令对象,命令对象再调用接收者的具体操作。该模式具有解耦、扩展性强、支持复杂操作等优点,适用于GUI按钮、撤销/重做、事务处理等场景。代码示例展示了如何通过命令模式实现灯的开关控制,体现了将请求封装为对象的设计思想。

2025-08-30 15:28:41 896

原创 继承中的向上转型、向下转型与动态绑定的深入解析

本文系统讲解了Java面向对象编程中的继承、转型与动态绑定等核心概念。继承通过extends实现代码复用和"is-a"关系;向上转型用父类引用指向子类对象,实现多态编程;动态绑定在运行时根据对象实际类型调用方法,是体现多态的关键机制;向下转型则需要谨慎使用以确保类型安全。文章通过完整的代码示例,展示了这些概念的具体应用和相互关系,帮助读者掌握编写灵活、可扩展Java代码的基础技术。

2025-08-18 21:42:14 1022

原创 ConcurrentHashMap源码解读

本文深入解析了Java并发容器ConcurrentHashMap的put方法实现原理,揭示其高并发设计艺术。通过putVal方法的分步剖析,展示了其线程安全与性能优化的关键设计:参数校验后计算哈希值,自旋插入时动态处理未初始化表、空桶、扩容迁移等场景,采用CAS无锁化尝试减少竞争,对冲突桶加细粒度锁(synchronized)处理链表或红黑树插入。同时通过MOVED、TREEBIN等特殊哈希值标记状态,结合扩容协助机制和链表树化优化,在保证线程安全的同时实现高效并发。

2025-08-09 19:11:53 669

原创 Spring Boot 启动流程

本文详细解析了Spring Boot的启动流程。首先介绍了@SpringBootApplication注解的三大功能:标记配置类、启用自动配置和组件扫描。然后深入分析了SpringApplication构造器的执行步骤,包括初始化属性、推断Web应用类型、加载初始化和监听器等。最后重点讲解了run()方法的执行流程,包括环境准备、上下文创建和容器刷新等关键阶段。整个启动过程通过分层设计,实现了自动配置和容器管理的完整生命周期控制。

2025-08-09 18:32:47 1036 1

原创 在Linux上部署tomcat、nginx

本文介绍了Tomcat和Nginx的安装部署流程。Tomcat部分包含JDK环境配置、Tomcat解压安装、用户权限设置及防火墙配置,最终通过8080端口访问。Nginx部分则通过添加yum仓库安装,配置80端口放行后即可访问。两种服务均提供了详细的命令行操作步骤和验证方法,适合初学者快速搭建Web服务环境。

2025-08-05 13:57:24 699

原创 在Linux上部署RabbitMQ、Redis、ElasticSearch

本文介绍了RabbitMQ、Redis和ElasticSearch的安装部署方法。RabbitMQ部分详细说明了构建yum仓库、安装步骤、服务管理及防火墙配置,并讲解了如何启用Web管理控制台。Redis安装则通过EPEL仓库进行,包含服务启停和端口放行说明。ElasticSearch部分简要提及了yum仓库的添加方法。三款工具均为企业级开发中常用的消息队列、缓存和搜索引擎服务,本文提供了清晰的Linux环境部署指南,适合快速搭建开发测试环境。

2025-08-05 13:56:31 1336 1

原创 Java 高并发优化实战(一):本地锁与分布式锁的组合方案详解

本文介绍了高并发场景下本地锁+分布式锁的双层锁优化方案。该方案通过本地锁(ReentrantLock)先阻挡同一节点的并发请求,再由分布式锁(Redisson)控制集群节点间的互斥,有效降低Redis压力,减少网络开销,提升系统吞吐性能。文章详细展示了商品库存扣减的代码实现,并给出锁处理流程图。同时提醒注意事项:需防范内存泄漏、锁未释放等问题,建议使用缓存结构而非synchronized构建锁池。这种多级锁机制兼顾性能与安全,是构建高可用系统的关键技术之一。

2025-07-25 13:39:02 1306

原创 在Linux上部署MySQL5.7和8.x

本文介绍了在Linux系统上安装MySQL数据库管理系统的详细步骤,包括5.7和8.0两个主要版本的安装方法。教程分为CentOS和Ubuntu系统环境,涵盖以下内容: 通过yum/apt仓库安装MySQL 启动服务及配置开机自启 获取并修改root初始密码 配置密码安全策略(可选简化密码) 设置远程登录权限 检查3306端口状态 注意事项:安装需要root权限,MySQL默认提供复杂度要求高的密码策略,生产环境不建议使用简单密码。教程适用于测试和学习环境,包含必要的SQL命令

2025-07-25 13:36:39 1219

原创 Redis 缓存三剑客实战:组合策略与高可用解决方案全解析

本文介绍了缓存常见的三种问题及解决方案:1)缓存雪崩-大量缓存同时失效,通过设置随机过期时间和双层缓存防护;2)缓存击穿-热点key失效时的高并发请求,提供互斥锁和逻辑过期两种方案,互斥锁保证单线程重建缓存,逻辑过期适合高并发读场景;3)缓存穿透-查询不存在数据,建议使用布隆过滤器拦截无效请求。文中包含具体Java代码实现,展示了如何设置随机过期时间、分布式锁应用以及逻辑过期处理流程。这些方案能有效解决缓存相关问题,保障系统稳定性。

2025-07-20 20:44:54 685

原创 JVM调优参数详解及实践指南

-Xms(初始堆大小):JVM启动时分配的初始内存。-Xmx(最大堆大小):JVM可使用的最大内存。

2025-07-19 13:12:02 1075

原创 Java内存泄漏全面解析与实战指南

本文全面解析Java内存泄漏问题,从核心概念、典型症状到专业排查流程。内存泄漏指无用对象仍被引用无法回收,会导致性能下降、系统崩溃和经济损失。诊断时需监控GC状态、获取堆转储并使用MAT工具分析。通过电商系统案例展示静态Map未清理引发的泄漏及优化方案(WeakHashMap+定期清理)。最佳实践包括配置OOM自动dump、建立监控基线和代码审查重点区域。未来方向涉及AI预测模型和云原生监控方案。文章提供了从发现问题到验证修复的完整解决流程和实用排查技巧。

2025-07-19 12:53:19 780

原创 AOP 失效的常见场景

AOP动态代理在Spring中主要通过JDK动态代理(基于接口)和CGLIB代理(基于继承)实现,但在以下场景中可能失效,导致拦截失败

2025-07-18 20:02:13 578

原创 缓存击穿:从分布式场景到本地层面的解决方案探究

本文介绍了缓存击穿问题及其解决方案。缓存击穿指热点数据过期时大量请求直接访问数据库,导致数据库压力骤增。解决方案包括:1)单机环境的双重检索机制,通过两次检查减少加锁开销;2)分布式环境的互斥锁方案,确保只有一个请求重建缓存;3)逻辑过期方案,通过设置逻辑过期时间实现异步更新缓存。三种方案各有优劣,双重检索性能较好但只适用于单机,互斥锁保证一致性但可能递归,逻辑过期性能最佳但存在短暂不一致可能。

2025-07-18 19:59:18 580

原创 保护性暂停原理

保护性暂停(Guarded Suspension)是一种常见的线程同步设计模式,常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式,一个线程在执行过程中会检查某个条件是否满足,如果不满足,就进入等待状态,直到另一个线程通知条件已满足。无非就是有点类似一个空盘子,一个消费者和生产者场景有点类似。有就唤醒消费者消费,没有消费者就等待。保护性暂停的超时等待应用于 join()方法中,可用于超时返回结果。

2025-04-22 18:50:33 444

原创 Java中线程状态的转换

活锁:线程并未被阻塞都在运行,但是却直处于一种伪“忙碌等待”,原因是:一个线程改变了另外一个线程的结束条件。WAITING:等待另外一个线程唤醒,通过wait()等方法,进入waitSet等待唤醒。顺序加锁可以解决死锁问题,但是会产生线程饥饿问题,有的线程始终或者很少获得cpu执行。jstack 是 Java 自带的线程转储工具,可以用于检测死锁。切换到 “线程” 面板,如果检测到死锁,会显示相关信息。死锁:同时争抢资源,相互等待对方资源释放,最终导致死锁。简单地说,就是心理戏太多,自己消耗自己。

2025-04-22 18:49:11 894

原创 解析ThreadLocal的底层原理

如果 ThreadLocalMap 中的 ThreadLocal 是弱引用:无论外部的 threadLocal 是否为 null,只要没有强引用指向 ThreadLocal 对象,它就会被垃圾回收器回收。如果 ThreadLocalMap 中的 ThreadLocal 是强引用:即使外部的 threadLocal 被设置为 null,ThreadLocal 依然会被 ThreadLocalMap 保持强引用,导致内存泄漏,直到 ThreadLocalMap 被销毁(如线程结束时)。

2025-04-17 09:25:16 936

原创 MySQL 基于规则的优化(含子查询优化)

我们编写的查询语句的搜索条件本质上是表达式。这些表达式可能比较复杂,无法高效运行,MySQL优化器会简化这些表达式,达到更高效的运行。下面讲优化器的优化规则,方便起见,用a、b、c等字母表示某个表的列名。

2025-04-17 09:24:33 1628

原创 常用字符串和集合处理工具类

Hutool:提供了一整套丰富的工具类,涵盖了文件操作、日期时间处理、网络请求、加密解密、JSON ,字符串与集合处理等多个方面,适合于各种日常开发任务。Gson:专注于 JSON 处理,提供了简单且强大的 API,适用于将 Java 对象与 JSON 字符串进行相互转换。Apache Commons Lang 是 Apache Commons 项目的一部分,旨在提供一组常用的功能,以简化 Java 应用程序的开发。

2025-04-16 08:13:31 988

原创 仿点评项目—项目总结

Redis实战,解决缓存穿透、缓存击穿、缓存雪崩等问题。

2025-04-16 08:12:50 962

原创 MVCC底层原理实现(含面试扩展)

指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,InnoDB通过undo log保存每条数据的多个版本,并且能够找回数据历史版本提供给用户读,每个事务读到的数据版本可能是不一样的。在同一个事务中,用户只能看到该事务创建快照之前已经提交的修改和该事务本身做的修改。MVCC只在已提交读(Read Committed)和可重复读。

2025-04-15 07:57:18 1755

原创 Spring Boot 中的 CommandLineRunner详解

CommandLineRunner 是 Spring Boot 提供的一个 应用程序启动时执行代码的接口。run(String…args):Spring Boot 启动后,会自动调用这个方法,并传入命令行参数。在 Spring Boot 应用启动后立即执行一段代码(比如初始化数据、执行任务等)。@Component:表示该类会被 Spring 扫描并注册到容器中。CommandLineRunner 是一个 函数式接口,它只有一个。

2025-04-15 07:55:54 307

原创 Spring MVC 拦截器与过滤器深度解析

拦截器(Interceptor): 只会拦截那些被 @Controller 或 @RestController 标注的类中的方法处理的请求,也就是那些由 Spring MVC 调度的请求。请求会根据 URL 路径、请求方法(GET/POST) 等信息,映射到 Controller 的某个方法上来处理。Controller 是 Spring MVC 的核心组件之一,用于处理用户的 HTTP 请求,并返回响应。过滤器(Filter): 会拦截所有类型的 HTTP 请求,包括静态资源和后台 API。

2025-04-14 08:02:03 337

原创 HttpServletRequest、ServerHttpRequest 和 ServerWebRequest作用详解

如果你使用的是响应式 Spring WebFlux,选择 ServerHttpRequest 或 ServerWebRequest。提供了更高级的 API,封装了 ServerHttpRequest 和 ServerHttpResponse。如果你使用的是传统的 Spring MVC,选择 HttpServletRequest。ServerWebRequest 更高级,封装了更多功能,适合复杂的业务场景。简单地说,就是心理戏太多,自己消耗自己。适合非阻塞式 I/O 的场景。适合阻塞式 I/O 的场景。

2025-04-14 08:01:29 922

原创 json和json字符串的区别

json类型字符串和json对象或者json数组是不一样的,json类型字符串本质是字符串,而json对象是json类型的数据,而且json类型数据分为两部分:json对象和json数组。网络传输的其实是对应的 json字符串 对象,前端接收后会将 json字符串 解析成 json对象。如何理解网络传输的json到底是什么数据。它是一个合法的 JSON 数组。这是一个包含数组表示的字符串。

2025-04-11 08:07:51 242

原创 @MapperScan和@ComponentScan的区别

当启动类没有配置对应的@MapperScan注解时,需要在每个mapper包下的类添加@Mapper注解,且所在的mapper包必须在启动类所在的包及其子包下,因为 @SpringBootApplication注解里面有对应的@ComponentScan,它会扫描启动类所在的包及其子包中含有的@Mapper并将其注册成bean。@ComponentScan是Spring框架中的一个注解,用于自动扫描和注册带有特定注解的组件为Spring管理的bean。上述两种效果是一样的!事已闭,过往仍在脑中演。

2025-04-11 08:07:33 796

原创 设计模式之【适配器模式】详解

将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

2025-04-10 09:29:22 1343

原创 设计模式之【建造者模式】详解

建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

2025-04-10 09:28:56 851

原创 设计模式之【代理模式】详解

动态代理(Dynamic Proxy)是一种在运行时动态创建代理对象的技术。与静态代理相比,动态代理不需要显式地编写代理类,而是在程序运行过程中由 JVM 自动生成代理对象。

2025-04-09 08:14:11 1125

原创 设计模式之【策略模式】详解

策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。它定义了一系列算法族,并将每个算法封装成独立的类,使它们可以​​相互替换​​。策略模式主要解决在多种相似算法存在时,使用条件语句(如if…else)导致的复杂性和难以维护的问题。

2025-04-09 08:13:39 877

原创 设计模式之【原型模式】详解

原型模式属于创建型模式,所以它是描述如何创建对象的模式。顾名思义,先搞一个原型对象出来,然后在这个原型对象的基础上修修补补再弄出一个新对象来。其核心是重写Object中的clone方法,调用该方法可以在内存中进行对象拷贝。这种模式的主要目的是为了提高性能和复用现有对象的状态。关键字就是Clone。

2025-04-08 08:13:08 1035

原创 设计模式之【桥接模式】详解

桥接模式(Bridge Pattern)是一种​​结构型设计模式​​,通过将​​抽象部分与实现部分分离​​,使二者可以独立变化。它使用​​组合关系代替继承关系​​,避免因多层继承导致的类爆炸问题。通过桥接模式,可以在运行时动态地给一个抽象化的对象设置不同的实现化对象,这样就能够在不改动代码的情况下增加新的实现或者改变现有的实现。

2025-04-08 08:11:28 723

原创 设计模式之【工厂模式】详解

工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。

2025-04-07 08:36:30 1068

原创 设计模式之【单例模式】详解

单例模式(Singleton Pattern)是一种常用的软件设计模式,其核心思想是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。单例模式主要用于控制资源的访问,比如配置文件的读取,数据库的连接等,通过确保这类资源全局只有一个实例,既可以避免对资源的多重占用,又可以减少系统的性能开销。*** 饿汉式:预加载* 静态成员变量*///定义静态成员变量获取本类的实例//私有构造方法,避免通过new关键字来实例化对象,保证只存在一个实例//提供一个公共的访问类,让外界获取该对象。

2025-04-07 08:35:38 950

原创 如何保证Redis和MySQL数据的一致性解析

由缓存的调用者在进行更新数据库的同时更新缓存**更新数据:**在进行数据库数据修改的时候,一般都是删除缓存,然后缓存为空,等待查询时候判空再进行数据库的查询然后更新缓存,而不是每次去做更新数据都进行更新缓存操作。

2025-04-06 09:33:20 420

原创 设计模式之【组合模式】详解

组合模式(Composite Pattern)是一种​​结构型设计模式​​,用于将对象组合成​​树形结构​​以表示"整体-部分"的层次关系。通过让客户端以​​统一的方式处理单个对象和组合对象​​,实现了对树形结构中所有节点的透明化操作。核心思想:通过共享接口,使得​​叶子节点​​(单个对象)和​​容器节点​​(组合对象)可以被一致对待,客户端无需关心操作的是单个对象还是组合结构。

2025-04-06 09:32:40 1631

原创 快速了解Websocket技术

WebSocket是一种全双工网络通信协议,它提供了在单个TCP连接上进行全双工通信的渠道。WebSocket使得客户端(通常是浏览器)和服务器之间可以进行持续的双向数据交换。传统的HTTP协议是请求/响应模式,即客户端发起请求后,等待服务器响应;而WebSocket允许服务器主动向客户端推送信息,同时也允许客户端与服务器进行实时通信。

2025-04-05 10:07:18 1172

原创 Spring中事务失效的原因详细解析

在同一个类内部,一个方法直接调用另一个带有 @Transactional 注解的方法时,调用的是对象的实际方法,而不是通过代理对象调用,因此事务增强逻辑不会被触发,导致事务失效。如果在一个带有事务的方法中开启了新的线程进行数据库操作,新线程中的操作不会参与到原线程的事务中,即使原线程的事务出现异常回滚,新线程中的操作也不会回滚。原因:Spring 的事务管理需要配置相应的事务管理器。如果没有正确配置事务管理器,或者在使用 @Transactional 注解时没有指定正确的事务管理器,事务将无法正常工作。

2025-04-05 09:49:20 602

原创 解决remote: error: GH007: Your push would publish a private email address.

注意:请将user.email更改为GitHub分配给您的电子邮件。它位于https://github.com/settings/emails。

2025-04-05 09:41:01 254

原创 redis远程连接不上解决办法

redis远程连接不上解决办法。

2025-04-03 18:40:26 352

空空如也

空空如也

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

TA关注的人

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