- 博客(166)
- 收藏
- 关注
原创 Java设计模式之《外观模式》
外观模式是一种简化复杂子系统接口的结构型设计模式。它通过提供一个统一的高级接口来隐藏系统内部复杂性,降低客户端与子系统的耦合度。该模式包含外观角色(协调子系统)、子系统组件和处理请求的客户端。其优点是简化调用、降低耦合、提供清晰入口,但可能违反开闭原则。以家庭影院系统为例,外观类封装了灯光、投影仪等设备的复杂操作,提供"一键观影"等简化接口,使客户端调用更便捷。该模式适用于需要简化复杂系统交互的场景,在Java日志系统等框架中广泛应用。
2025-08-27 21:03:31
1167
原创 Java设计模式之《亨元模式》
享元模式是一种通过对象共享减少内存使用的设计模式,其核心思想是"共享不变部分,分离变化部分"。该模式包含抽象享元、具体享元、享元工厂和客户端四个角色,通过将重复的内部状态共享,仅保留变化的外部状态实现优化。典型应用场景包括文本编辑器字符样式、游戏对象、连接池等。文中以奶茶店为例,展示了如何通过共享口味配方(内部状态)而仅改变顾客姓名(外部状态)来节省对象创建开销。该模式能显著降低内存占用,但增加了系统复杂性,适用于存在大量相似对象的场景。
2025-08-27 16:19:35
768
原创 Java设计模式之《状态模式》
状态模式是一种行为型设计模式,允许对象在内部状态改变时改变其行为。它通过将状态封装为独立类来解决if-else判断的弊端,实现开闭原则。文章对比了传统if-else实现与状态模式实现,展示了状态模式在订单系统等场景的优势:解耦状态和行为、可扩展性强、避免条件语句膨胀。同时提供了优化方案,如使用集合管理状态流转,使业务流程可配置化。状态模式适用于状态多且变化频繁的系统,但也可能增加系统复杂度。总体而言,该模式能有效管理复杂状态转换逻辑。
2025-08-26 14:45:11
915
原创 关于Java类加载的详细介绍
JVM类加载过程详解 JVM执行Java程序的核心过程包括类加载、运行时数据区管理、执行引擎和本地库接口。类加载过程分为五个阶段: 加载:通过类全名获取二进制字节流,转化为方法区数据结构,生成Class对象 验证:检查字节码合法性,包括文件格式、元数据、字节码和符号引用验证 准备:为静态变量分配内存并设置默认初始值 解析:将符号引用转换为直接引用 初始化:执行类构造器方法,完成静态变量赋值和静态代码块执行 类加载遵循双亲委派模型,由Bootstrap、Extension和Application三类加载器协同
2025-08-26 11:16:52
964
原创 JDK9-21的新特性持续介绍
本文介绍了JDK中几个关键特性:1)JDK9的@Contended注解,用于防止多线程环境下的伪共享问题,通过填充字节使变量独占缓存行;2)JDK16引入的record类型,简化不可变数据类的定义,自动生成常用方法;3)JDK21的虚拟线程(Virtual Threads),通过轻量级用户态线程实现高并发,特别适合IO密集型场景。这些特性分别针对并发优化、代码简化和性能提升,展示了Java在多线程编程和数据建模方面的持续演进。
2025-08-25 13:34:38
940
原创 常用的分布式ID设计方案
本文探讨分布式系统中ID生成方案,分析6种主流方法:1)数据库自增ID存在单点瓶颈;2)号段模式通过批量获取ID平衡性能与可用性;3)UUID无序但无需中心节点;4)Snowflake算法结合时间戳、机器ID和序列号实现高性能分布式生成;5)Redis原子操作适合高并发递增ID;6)Zookeeper顺序节点保障绝对有序。综合对比显示,Snowflake及其改进版适用于大多数高并发场景,而具体选择需权衡唯一性、性能、有序性等需求。数据库号段和Redis方案在中低并发场景具有优势,UUID则适合无序场景。
2025-08-25 10:28:54
1022
原创 JDK21之虚拟线程的深入理解
JDK21引入了虚拟线程(VirtualThread),这是Java并发编程的重要革新。虚拟线程是JVM管理的轻量级线程,与传统平台线程(1:1映射操作系统线程)不同,它通过用户态调度实现高并发。核心优势包括:支持百万级并发(堆内存按需分配栈空间)、兼容现有Thread API、自动挂载/卸载降低阻塞开销,特别适合IO密集型场景(如微服务、网络请求)。相比线程池+CompletableFuture方案,虚拟线程能用同步写法达到异步性能,但需注意不适用于计算密集型任务或涉及JNI阻塞的场景。其底层通过Cont
2025-08-22 11:35:25
1029
原创 关于常用线程池CompletableFuture和Future的介绍
Java异步编程中,Future和CompletableFuture是两种主要实现方式。Future通过ExecutorService.submit()提交任务,需调用get()阻塞获取结果,适合简单异步场景;而CompletableFuture采用链式非阻塞回调机制,支持任务编排和异常处理,默认使用ForkJoinPool,更适合复杂异步流程。核心区别在于:Future需主动获取结果(同步等待),CompletableFuture可通过回调自动处理(异步响应)。新项目更倾向使用CompletableFut
2025-08-22 11:01:18
733
原创 关于localhost和127.0.0.1的区别联系
【摘要】localhost和127.0.0.1都指向本地主机,但存在关键差异:127.0.0.1是固定IPv4回环地址,直接通过网络栈通信;localhost是域名,需通过hosts文件解析(默认指向127.0.0.1或IPv6的::1)。主要区别体现在:1)MySQL连接时localhost可能使用Unix域套接字;2)IPv6环境下localhost可能解析为::1;3)hosts文件修改会影响localhost解析。建议开发时优先使用localhost(可读性好),调试特定协议时用对应IP地址(127
2025-08-21 14:42:33
996
原创 会话技术之<Cookie>和<Session>的区别联系
本文系统介绍了Web开发中Cookie和Session的机制与应用。Cookie是存储在客户端的小型数据,通过Set-Cookie下发,随请求自动携带,适用于存储偏好设置等非敏感信息;Session则是服务器端存储的会话数据,通过sessionid关联客户端,更安全但增加服务器负担。文章详细对比了两者在存储位置、数据大小、安全性、生命周期等方面的差异,并提供了具体实现方法(如HttpOnly/Secure属性设置)和安全建议(防范XSS/CSRF)。最后指出Cookie适合客户端轻量存储,Session适合
2025-08-19 19:03:39
840
原创 关于诸多编程语言类型介绍
本文探讨了强类型语言的定义、特点及其与静态类型语言的关系。强类型语言要求在编译或运行时进行严格类型检查,禁止隐式类型转换(如Java),而弱类型语言则允许自动类型转换(如JavaScript)。强类型语言具有类型安全、编译优化等优势,但灵活性较低。文章还比较了静态类型(编译期检查)与动态类型的区别,指出Java兼具强类型和静态类型特性。最后总结了强类型语言在代码健壮性方面的优势及其在跨语言协作中的复杂性挑战。
2025-08-19 14:02:00
636
原创 Java设计模式之《工厂模式》
本文系统介绍了工厂模式在面向对象编程中的应用。主要内容包括:工厂模式的定义,将对象创建过程封装隔离以提高灵活性;三种实现方式(简单工厂模式、工厂方法模式、抽象工厂模式)的特点和适用场景,通过汽车生产示例展示模式演进;各模式的Java代码实现示例及其优缺点分析。文章指出,工厂模式的核心价值在于解耦对象的创建和使用,便于系统扩展,并比较了不同模式的适用条件:简单工厂适用于单一产品,工厂方法适用于产品扩展,抽象工厂适用于配套产品族的创建。
2025-08-16 23:13:08
1144
原创 MySQL的《Buffer-pool》和《连接池》介绍
本文介绍了MySQL中两个关键性能优化组件:缓冲池(BufferPool)和连接池(ConnectionPool)。BufferPool是InnoDB的内存缓存区,通过LRU算法管理数据页,减少磁盘I/O,包含数据页、索引页、变更缓冲等结构。连接池管理数据库连接复用,降低创建连接开销,控制并发连接数。两者协同工作:连接池稳定并发请求,BufferPool缓存热数据,共同提升数据库性能。文章详细说明了两者的工作机制、配置参数和监控方法,并强调需要根据业务特点合理配置这些组件。
2025-08-16 22:35:37
909
原创 分布式系统设计的容错机制
分布式系统容错机制:熔断、降级、限流与隔离 摘要:本文系统介绍了分布式系统中四种核心容错机制。熔断通过状态机实现故障隔离,避免级联故障;降级提供柔性方案,在服务不可用时返回预设结果;限流通过令牌桶等算法控制请求速率;隔离将资源划分为独立单元,限制故障影响范围。文章详细阐述了各机制的工作原理、实现方式和关键参数,并提供了Java代码示例。这些策略通常组合使用,配合监控指标,共同保障系统在高并发和依赖故障时的可用性。
2025-08-15 22:15:36
635
原创 MqSQL中的《快照读》和《当前读》
共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。如果事务T仅对数据A进行读取,那么会对数据A加上共享锁,之后则其他事务如果要读取数据A的话可以对其继续加共享锁,但是不能加排他锁(也就是无法修改数据)。获准共享锁的事务只能读数据,不能修改数据。用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。如果事务T对数据A要进行修改,则需要对其添加排它锁,加上排他锁后,则其他事务不能再对A加任任何类型的封锁。
2025-08-15 20:41:39
939
原创 JVM的逃逸分析深入学习
Java编译过程中,JVM通过逃逸分析判断对象作用域范围,优化内存分配和性能。逃逸分析分为无逃逸、方法级逃逸和线程级逃逸三种情况,JIT编译器据此进行栈上分配、标量替换和锁消除等优化。测试表明,开启逃逸分析后无逃逸代码执行效率显著提升。但该技术存在保守分析、依赖方法内联等限制。开发者可通过JVM参数控制逃逸分析行为,建议结合JMH等工具验证优化效果,而非过早进行微观优化。
2025-08-14 21:30:06
1024
原创 Java设计模式之《原型模式》--深、浅copy
本文介绍了原型设计模式及其实现方式。原型模式通过克隆已有对象创建新实例,适用于对象创建成本高或需要大量相似对象的场景。与Spring原型作用域不同,原型模式强调对象自身的复制能力。文章详细讲解了浅拷贝和深拷贝的区别:浅拷贝仅复制对象本身,共享引用字段;深拷贝则递归复制所有引用对象。提供了三种实现方式:基于Cloneable接口的浅/深拷贝、使用序列化的深拷贝以及原型注册表管理。最后指出原型模式适用于高效创建相似对象,浅拷贝适合简单对象,深拷贝则适合复杂对象结构。
2025-08-14 19:38:11
822
原创 Java设计模式之《策略模式》
策略模式是一种行为设计模式,通过封装算法族使其可互换使用。它的优点包括算法可自由切换、避免多重条件判断、易于扩展;缺点是客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式将造成产生很多策略类。
2025-08-14 13:28:05
783
原创 Mysql使用Canal服务同步数据->ElasticSearch
Canal是阿里巴巴开源的一款MySQL数据库增量日志解析组件,通过模拟MySQL Slave获取binlog日志并解析,将数据同步到下游系统如Elasticsearch。本文详细介绍了Canal的工作原理、部署流程和配置方法,包括MySQL端binlog开启、Canal服务端和客户端配置、常见问题解决等。同时提供了两种数据同步方案:直接写入Elasticsearch和通过消息队列中转,并对索引映射、数据一致性、性能优化等关键问题给出了建议。文章还包含了完整的Java客户端实现代码示例,为MySQL到Ela
2025-08-05 22:41:09
821
原创 Java直接内存的介绍和实现
Java中的直接内存是不受JVM管理的内存区域,通过ByteBuffer.allocateDirect()分配,由操作系统直接管理。相比堆内存,直接内存能减少数据拷贝和GC压力,提升I/O性能,但需手动释放或通过-XX:MaxDirectMemorySize限制大小。使用场景包括高性能网络通信(如Netty)和大文件处理,但存在内存泄漏风险。合理使用直接内存能优化性能,但需注意资源管理。
2025-08-04 20:39:36
584
原创 Kafka在Springboot项目中的实践
本文介绍了Kafka的核心原理及在Java中的实现方式。主要内容包括:1) Kafka的ack机制(0/1/all三种确认方式)和集群组成;2) 原生Kafka客户端的使用,详细说明了生产者三种发送方式(单向/同步/异步)和消费者两种offset提交方式;3) SpringBoot集成Kafka的简便实现,包括配置、使用KafkaTemplate发送消息和@KafkaListener监听消息。Kafka凭借高吞吐量、持久化和实时处理能力,已成为大数据和实时系统的重要组件。文章提供了从原理到实践的完整指导,适
2025-07-31 21:04:09
1117
原创 Java设计模式之《命令模式》
命令模式是一种行为型设计模式,将请求封装为对象,实现请求发出者与接收者的解耦。其核心结构包括Command接口、具体命令类、Receiver接收者、Invoker调用者和Client客户端。典型应用包括Java的Runnable接口、TimerTask和数据库Statement等。该模式优点在于解耦请求与执行、支持参数化请求、便于实现撤销/重做和任务队列,但会增加类的数量。示例通过餐厅点餐场景(顾客-服务员-厨师)展示了命令模式的实现方式,体现了其将动作封装为对象的核心思想。
2025-07-31 20:06:46
1029
原创 关于MyBatis 的懒加载(Lazy Loading)机制
摘要:本文详细介绍了MyBatis中的懒加载(延迟加载)技术。懒加载是指在需要时才查询关联数据,而非初始加载时获取所有数据,能有效提升数据库性能。文章从定义、实现原理、配置方法(全局和局部)、三种加载时机(直接加载、侵入式延迟、深度延迟)等方面进行阐述,并通过订单-用户关联查询的代码示例演示具体实现方式。同时指出需要注意N+1查询、连接生命周期等问题,建议结合aggressiveLazyLoading=false配置使用。适用于一对一、一对多等关联映射场景。
2025-07-30 19:47:30
1266
原创 Properties、HashTable、HashMap对于null值的容忍分析
本文介绍了Java中的Properties类,它是Hashtable的子类,用于处理键值对形式的持久化属性集。文章阐述了Properties的特点:继承自Map体系,键值均为字符串类型,支持流操作,常用于配置文件管理。通过代码示例展示了Properties在文件读写、classpath资源读取等场景的应用。同时对比了HashMap、Hashtable和Properties对null值的处理差异:HashMap允许null键值,而Hashtable和Properties则禁止,并分析了这种设计的原因,包括线程
2025-07-30 13:21:46
827
原创 Redis内存使用耗尽情况分析
Redis内存耗尽处理机制及应对策略 摘要: 本文分析了Redis内存耗尽时的处理机制及应对策略。当内存达到maxmemory限制时,Redis会根据配置的淘汰策略处理:默认noeviction策略会拒绝写入并返回OOM错误;LRU/LFU等策略则会自动淘汰数据腾出空间。文章详细介绍了7种淘汰策略的适用场景和风险,指出缓存场景适合allkeys-lru,而核心业务应采用noeviction并配合监控告警。同时分析了内存耗尽的常见原因,包括数据总量超标、AOF/RDB备份、内存碎片等,并提出了监控指标建议(u
2025-07-29 18:48:29
1448
原创 Java设计模式之《备忘录模式》
备忘录模式是一种行为型设计模式,用于在不破坏封装性的前提下保存和恢复对象状态。该模式包含三个核心角色:Originator(负责创建备忘录)、Memento(存储状态)和Caretaker(管理备忘录)。典型应用场景包括撤销操作、历史记录和状态恢复等。其优点在于保持对象封装性同时支持状态管理,但缺点是可能带来内存占用和性能开销。该模式在文本编辑、游戏存档等需要状态管理的场景中具有重要价值。
2025-07-29 14:02:42
1198
原创 Java设计模式之<建造者模式>
建造者模式是一种用于分步构建复杂对象的设计模式。它将对象构造过程分离,通过抽象建造者接口定义构建步骤,具体建造者实现各步骤细节,指挥者控制组装流程。与工厂模式不同,建造者模式强调分步骤定制,适用于参数多变的复杂对象构建场景,如汉堡定制、字符串拼接等。其优势在于灵活性和可扩展性,但会增加代码复杂度。典型应用包括Lombok的@Builder、StringBuilder和MyBatis的SqlSessionFactoryBuilder等。
2025-07-28 18:44:57
730
原创 Java设计模式之<装饰器模式>
摘要:装饰器模式是一种结构型设计模式,允许在不修改原有类的情况下动态扩展对象功能。通过抽象组件(接口)、具体组件(原始对象)、抽象装饰器(持有组件引用)和具体装饰器(功能扩展)实现,典型应用如Java IO流。以咖啡加料为例,该模式避免了继承带来的类膨胀问题,支持灵活的功能组合,但可能增加系统复杂度。
2025-07-28 14:21:22
743
原创 Java排序算法之<归并排序>
归并排序是一种采用分治法的高效排序算法。其时间复杂度为O(nlogn),空间复杂度为O(n),具有稳定性。算法通过递归地将序列二分至单个元素,再两两合并有序子序列完成排序。具体实现包括:申请同等大小的临时数组、递归分组、比较合并等步骤。文中提供了完整的Java代码示例,展示了序列[28,19,8...9]的完整排序过程,最终输出有序结果[8,9,10...28]。该算法适合处理大规模数据,但需要额外存储空间。
2025-07-28 10:24:28
881
原创 Java排序算法之<希尔排序>
希尔排序是一种改进的插入排序算法,由Donald Shell于1959年提出。其核心思想是通过分组间隔(gap)将数组分成若干子序列进行插入排序,逐步缩小gap直至1,最终完成排序。该算法通过长距离元素交换使数据快速接近有序,提高了排序效率。时间复杂度通常在O(nlogn)到O(n²)之间,取决于gap序列的选择。希尔排序具有原地排序、空间复杂度低(O(1))等优点,适用于中小规模数据排序和内存受限环境,但不稳定且gap选择不当可能影响性能。相比普通插入排序,希尔排序能显著提升对中等规模数据的处理效率。
2025-07-27 12:31:26
1238
原创 Spring的@Indexed注解
本文介绍了Java中@Indexed注解的应用场景及实现方式。1. Spring框架中的@Indexed用于优化启动性能,通过预编译生成索引文件(META-INF/spring.components)替代运行时扫描,适合包含大量注解类的大型项目。2. JPA/Hibernate中的@Index用于数据库表字段索引,提升查询效率。3. 其他场景包括Elasticsearch的全文检索索引配置。4. 文章还提供了自定义@Indexed注解的方法。最佳实践建议在组件数量多(>100)时使用spring-co
2025-07-26 13:31:52
936
原创 Java排序算法之<插入排序>
摘要:本文介绍了插入排序算法及其Java实现。插入排序通过将数组分为已排序和未排序部分,逐个插入元素到正确位置,时间复杂度为O(n²),在部分有序数据中表现较好。文章详细讲解了算法流程、Java代码实现(包含边界处理和关键步骤解析),并分析了其性能优于选择排序的原因:比较次数少、提前终止机制和更好的数据局部性。适合处理小规模或基本有序数据,是学习排序算法的重要基础。
2025-07-26 12:35:30
1080
原创 Java排序算法之<选择排序>
选择排序是一种通过每次从未排序部分选出最小元素放到已排序序列末尾的排序算法。它不稳定,可能在排序过程中改变相同元素的原始顺序(如5A和5B的相对位置)。算法执行流程是逐轮确定元素位置,Java实现通过双重循环完成。相比冒泡排序,选择排序交换次数更少(最多n-1次),适合写操作代价高的场景,但时间复杂度仍为O(n²)。文中提供了完整的Java代码示例展示其实现过程。
2025-07-25 15:14:05
476
原创 Java排序算法之<冒泡排序>
摘要:本文介绍了冒泡排序的基本原理、算法步骤及Java实现(含优化)。冒泡排序通过重复比较相邻元素并交换顺序错误的元素,将最大值逐步"冒泡"至数组末尾。文章给出了带优化标志的Java代码实现,分析了其O(n²)的时间复杂度,并指出其优点(简单、稳定、空间高效)和缺点(效率低)。最后建议大数据量时使用Java内置的Arrays.sort()方法。附有测试示例和参考链接。
2025-07-25 14:43:26
1104
原创 分布式共识算法及Raft算法
Raft是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。用来多个节点之间达成共识的,其可以解决一定的一致性问题。 解决分布式系统的 数据一致性 问题,即在部分节点故障或网络分区时,集群仍能安全地执行操作并保持数据一致。
2025-07-24 23:03:41
2155
原创 Mybatis的缓存机制介绍
MyBatis缓存机制分为一级缓存和二级缓存。一级缓存默认开启,作用于SqlSession级别,相同查询在同一个会话内直接从缓存获取结果。二级缓存作用于Mapper命名空间级别,需手动配置开启,支持跨SqlSession共享数据。查询时优先检查二级缓存,未命中再查一级缓存。一级缓存在增删改操作或会话关闭时清空,二级缓存可通过序列化持久化存储。合理使用缓存能显著提升查询效率,但写多读少场景需谨慎使用二级缓存以避免数据不一致问题。
2025-07-24 14:45:00
920
原创 分布式事务之《本地消息表》解决方案
本文介绍了基于本地消息表的分布式事务解决方案。该方案通过将业务操作与消息记录在同一个本地事务中实现原子性,利用定时任务异步派发消息保证最终一致性。系统包含订单表、消息表、库存表等核心表结构,通过订单服务创建订单并记录消息,定时任务扫描未处理消息并调用库存服务进行处理,库存服务通过消息ID实现幂等控制。方案优点在于实现简单、高性能和解耦服务,适合对强一致性要求不高的场景(如电商订单)。文章详细说明了业务流程、代码实现和常见问题处理,并指出该方案能有效保证分布式系统的可靠性与可控一致性。
2025-07-22 13:30:54
737
原创 Spring和SpringBoot的动态代理区别联系
摘要:Spring框架通过代理机制实现AOP功能,主要包括JDK动态代理和CGLIB代理两种方式。JDK动态代理基于接口,通过InvocationHandler实现方法增强;CGLIB代理则通过生成目标类的子类来实现代理。Spring 5.x默认使用JDK动态代理,而Spring Boot 2.x及以上版本默认采用CGLIB代理。代理机制广泛应用于AOP切面、事务管理(@Transactional)、异步方法(@Async)和声明式缓存(@Cacheable)等场景。开发者可以通过@Pointcut定义切点
2025-07-18 16:45:51
724
原创 计算机的网络体系及协议模型介绍
网络协议是设备间通信的规则集合,采用分层体系结构(如OSI七层和TCP/IP四层模型)简化设计与维护。协议包含语法、语义和同步三大要素,确保数据传输的标准化。TCP/IP协议族是互联网核心,包含应用层(HTTP/DNS等)、传输层(TCP/UDP)、网络层(IP)和链路层。HTTP用于传输超文本,而HTTPS是其安全版本。协议分层虽带来灵活性,但也存在功能冗余问题。网络通信中,各层通过封装/解封装数据实现透明传输,状态码则反馈请求处理结果。
2025-07-17 21:00:56
1028
原创 Spring的@ControllerAdvice对全局异常处理
ControllerAdvice是SpringMVC中用于全局处理的注解,它配合@ExceptionHandler处理全局异常,@ModelAttribute预设全局数据,以及@InitBinder实现请求参数的预处理。通过@ExceptionHandler可以捕获并处理特定类型的异常,@ModelAttribute可以注入Model中的全局属性,@InitBinder则用于初始化WebDataBinder,注册自定义编辑器,对请求参数进行预处理。 @ControllerAdvice不是传统AOP意义。
2025-07-17 14:48:26
689
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人