- 博客(33)
- 收藏
- 关注
原创 java设计模式之状态模式(State Pattern)
该模式通过将不同状态下的行为封装到独立的类中,使得状态转换更加清晰,避免了复杂的条件判断。:每个状态类在行为方法中自行决定后续状态(分散管理,更符合单一职责)。:处理订单状态(待支付、已支付、已发货、已完成)。:通过封装状态及其转换逻辑,使代码更易维护和扩展。:将状态行为委托给独立对象,环境类仅维护当前状态。:控制流程节点状态(审批中、已通过、已驳回)。每个状态类封装对应行为,并处理状态转换逻辑。:适用于对象行为随状态变化且状态较多的场景。:例如订单状态(待支付、已支付、已发货)。:避免在代码中频繁使用。
2025-03-24 20:15:37
636
原创 ConcurrentHashMap 详解
它用来解决HashMap在多线程环境下不安全的问题,同时相比Hashtable和Collections.synchronizedMap()有更好的并发性能。:仅锁定单个桶(链表或红黑树的头节点),不同桶的修改互不阻塞。迁移策略:将旧数组划分为多个区间,线程协助迁移不同区间的数据。迁移时读操作:旧桶未迁移完时从旧桶读取,迁移后从新桶读取。:适用于高并发环境下的键值存储,需权衡一致性与性能。默认数组大小:16,负载因子:0.75。:每个线程负责迁移旧数组的一段区间。:红黑树的根容器,持有树的根节点。
2025-03-23 09:30:00
619
原创 Java ReentrantLock 详解
通过灵活的锁机制和强大的功能(如可中断、超时、公平性),弥补了的不足,适用于复杂同步场景。其核心在于 AQS 的实现,通过state和 CLH 队列高效管理锁状态和线程等待。合理使用能显著提升并发程序的健壮性和性能。
2025-03-22 08:00:00
1278
原创 Java synchronized 关键字详解
原理:通过 CAS 操作将 Mark Word 替换为指向线程栈中锁记录的指针。原理:在 Mark Word 中记录线程 ID,避免 CAS 操作。:每个 Java 对象在堆内存中都有一个对象头,包含。:JVM 检测到不可能存在共享竞争的锁,自动移除。:同一时刻仅允许一个线程访问该对象的同步方法。:显式指定的对象(任意对象均可作为锁)。:将连续的多个锁合并为一个,减少锁开销。:多个线程互相持有对方需要的锁。:减少锁的持有时间,提高并发性。:通过互斥锁解决多线程并发问题。:锁住类的所有实例的静态方法。
2025-03-21 09:43:58
1368
原创 Java多线程详解——看这一篇就够了
拒绝策略(AbortPolicy/CallerRunsPolicy/DiscardPolicy/DiscardOldestPolicy等):任务队列(ArrayBlockingQueue/LinkedBlockingQueue)多线程是Java编程的核心技术之一,能够充分利用多核CPU资源,提升程序性能。StoreStore屏障:禁止普通写与volatile写重排序。LoadStore屏障:禁止普通写与volatile读重排序。LoadLoad屏障:禁止普通读与volatile读重排序。
2025-03-20 13:28:26
815
原创 Java设计模式之命令模式(Command Pattern)
命令模式通过将操作封装为对象,实现了请求发送者与接收者的解耦,适用于需要支持撤销、事务、批量操作等复杂场景。,它将请求封装为独立的对象,使得不同请求的调用、队列化、日志记录或撤销操作成为可能。该模式通过解耦请求的发送者与接收者,增强系统的灵活性和扩展性。:将请求转换为包含所有请求信息的独立对象(命令),支持参数化、延迟执行、撤销/重做等功能。:按钮点击事件绑定命令对象,支持撤销(如Photoshop的“撤销上一步”)。:数据库事务的提交与回滚可视为命令模式的应用。支持命令的队列、日志、撤销/重做。
2025-03-20 10:50:50
481
原创 Java IO流详解
Java IO流提供了丰富的类库支持各种数据操作,关键在于根据场景选择合适的流类型,并合理组合装饰器类提升性能。掌握字节流与字符流的区别、异常处理机制及编码问题,是高效使用IO流的核心。Java的IO(输入输出)流是处理数据输入输出的核心API,主要用于文件操作、网络通信、设备交互等场景。处理文本数据(如TXT、CSV),基于字符编码(UTF-8、GBK),核心类为。:将字节流转换为字符流(可指定编码)。:将字符流转换为字节流(可指定编码)。:读取文本文件(使用默认编码)。:文本用字符流,二进制用字节流。
2025-03-19 15:55:47
991
原创 Java设计模式之模板方法模式(Template Method Pattern)
假设需要实现制作茶和咖啡的流程,两者步骤类似(烧水、冲泡、倒入杯子),但具体冲泡方法和添加调料不同。:框架定义通用流程,允许用户自定义部分步骤(如Servlet生命周期、JUnit测试流程)。:当多个类有相似的流程,但某些步骤实现不同时(如数据处理流程、文件解析流程)。:适用于具有固定流程但部分步骤需要定制的场景,如框架扩展、多态流程处理。,用于定义算法的骨架,将某些步骤的具体实现延迟到子类中。:通过父类定义算法流程,子类灵活实现具体步骤,实现代码复用和流程控制。方法为模板方法,由框架调用。
2025-03-19 11:00:57
479
原创 JVM(Java虚拟机)的核心组成
允许Java代码调用本地方法(Native Method,如C/C++库)。:元空间(Metaspace),使用本地内存(Native Memory)。:Eden区、Survivor区(From/To),使用复制算法回收。方法区的一部分,存储类文件中的常量(如字符串字面量、符号引用)。主流JVM(如HotSpot)采用分层编译(C1、C2编译器)。:私有区域隔离线程状态,共享区域需同步机制(如锁、CAS)。存储类元数据(如类名、字段、方法)、常量池、静态变量等。
2025-03-18 11:28:46
1311
原创 Java反射机制详解
反射是Java高级编程的核心技术之一,适用于框架开发、动态代理等场景。尽管功能强大,但需谨慎使用,避免性能问题和代码维护困难。从Java 9开始,模块系统(Module System)限制了对未导出包的反射访问。代表一个类或接口的元数据,是反射操作的入口。:动态加载类、调用方法,适合框架和库的开发。:反射操作比直接代码慢(JIT优化受限)。:支持插件化架构,运行时加载新功能。:绕过访问检查,可能破坏封装性。:ORM映射,动态生成实体类。:代码可读性差,调试复杂度高。在性能敏感场景,避免反射。
2025-03-18 11:14:06
541
原创 Java 设计模式之享元模式(Flyweight Pattern)
旨在通过共享对象来有效支持大量细粒度对象的复用,从而减少内存占用和提高性能。假设需要绘制大量树(Tree)对象,树的类型(名称、颜色)可共享,位置和年龄为外部状态。类的常量池是享元模式的典型实现,相同字面量的字符串对象被复用。,适用于存在大量重复对象且对象的大部分状态可以外部化的场景。:通过共享内部状态减少对象数量,外部状态由客户端传递。:存在大量相似对象且内存占用是瓶颈时优先考虑。:享元工厂管理共享对象池,确保唯一性。:字符的字体、颜色、大小。:字符在文档中的位置。:子弹的位置、速度。
2025-03-17 15:48:38
478
原创 基于Netty实现高性能HTTP反向代理
以下将分步骤实现一个基于Netty的高性能HTTP反向代理,支持动态路由、负载均衡和基础鉴权功能。:随机选择后端节点(可扩展为轮询、加权等策略)。:通过内存配置实现请求路径到后端服务的映射。:利用Netty的NIO模型处理高并发请求。添加熔断限流(如Sentinel)。避免不必要的内存复制(如直接使用。增加Prometheus监控指标。集成Nacos实现动态路由配置。:验证请求头中的Token。支持WebSocket协议。线程模型,避免阻塞操作。实现请求的异步转发。
2025-03-16 09:30:00
298
原创 Java设计模式之组合模式(Composite Pattern)
实际开发中需注意避免叶子节点被迫实现冗余方法(可通过接口分离优化)。模拟文件系统中的文件和文件夹结构,文件夹可以包含文件或其他文件夹。,实现了对单个对象和组合对象的一致性处理。,无需关心具体是叶子节点还是容器节点。,用于将对象组合成树形结构以表示。:如 Java Swing 中的。的场景,能够显著提升代码的。:支持多级菜单项和子菜单。:公司部门与员工的关系。:处理嵌套的节点结构。
2025-03-15 09:00:00
364
原创 Spring、Spring Boot、Spring Cloud 的区别与联系
Feign(声明式 HTTP 客户端)、RestTemplate + Ribbon(负载均衡)。:默认集成 Tomcat、Jetty 或 Undertow,无需部署 WAR 包。:支持 JDBC、ORM(如 Hibernate、MyBatis)。:基于 Servlet 的 MVC 框架,处理 HTTP 请求。提供分布式能力(如服务发现、配置中心、熔断)。:传统单体应用,需要精细控制配置的复杂场景。:提供应用监控端点(如健康检查、指标收集)。是基础,提供核心功能(IoC、AOP)。
2025-03-14 16:19:58
2606
原创 基于Netty的即时通讯服务器
实际项目中可根据需求扩展协议(如Protobuf)、集成SSL加密或优化内存管理。实现一个简单的聊天服务器,支持多客户端连接、消息转发和心跳检测。:基于Netty实现高性能HTTP反向代理。管理所有连接的客户端,实现消息群发。通过此示例,可深入理解Netty在。处理连接,workerGroup。:使用 ChannelGroup。实现字符串与二进制数据的转换。:处理海量设备连接和指令下发。解决TCP粘包/拆包问题。:实时同步玩家位置和动作。检测空闲连接并关闭。
2025-03-14 16:12:19
890
原创 Java设计模式之外观模式(Facacde Pattern)
旨在为复杂的子系统提供一个统一的、简化的高层接口,使得客户端更容易使用子系统功能。假设家庭影院包含多个设备(灯光、音响、投影仪),通过外观模式一键启动“观影模式”。:当系统存在多个复杂模块或接口时,提供一个统一入口。:减少客户端与子系统的直接依赖,提高系统可维护性。:为不同层次的模块提供统一接口(如API网关)。:外观类通过组合子系统对象,对外暴露统一方法。:通过封装复杂子系统,提供简洁易用的接口。:ZIP、RAR、7z 等压缩算法。:多个微服务(订单、用户、支付)。:网关统一处理鉴权、限流、路由。
2025-03-13 14:48:48
666
原创 Netty架构图
Netty 的架构通过分层设计和高效线程模型,实现了高吞吐、低延迟的网络通信。:避免线程切换,保证同一 Channel 的事件由同一线程处理(无锁化设计)。:支持自定义传输实现(如 UDP、Unix Domain Socket)。绑定一个线程,处理多个 Channel 的 I/O 事件和异步任务。:同一 Channel 的所有事件由同一线程处理,避免并发问题。:默认线程数为 CPU 核心数 × 2,可通过构造函数指定。)事件(如数据解码、业务逻辑)。的任务队列,由绑定线程执行。方法触发事件在链中的传递。
2025-03-12 10:30:38
635
原创 java设计模式之桥接模式
假设需要设计一个系统,支持不同品牌手机(华为、苹果)运行不同的软件(相机、通讯录),且手机品牌与软件功能可以独立扩展。通过组合而非继承的方式,桥接模式解决了多层继承带来的类爆炸问题,并提高了系统的扩展性。:当一个类存在多个独立变化的维度,且需要灵活组合时(如手机品牌与手机软件)。:当系统中存在多个独立变化的维度,且需要灵活组合时优先考虑桥接模式。:不同操作系统的绘制实现(如Windows、Linux)。:抽象化类持有实现化接口的引用,通过委托调用实现功能。:通过组合替代继承,解决多维度变化的扩展问题。
2025-03-12 08:59:12
427
原创 Java设计模式之装饰者模式
装饰者模式(Decorator Pattern)是一种结构型设计模式,允许动态地向对象添加额外的职责。它通过将对象包装在装饰者类中,以提供比继承更灵活的扩展功能方式。假设咖啡店销售多种饮料(如浓缩咖啡、黑咖啡),并允许添加多种调料(如牛奶、摩卡、糖)。:多层装饰可能导致对象链较长,不易追踪问题。:继承组件接口,并持有一个组件对象的引用。:扩展装饰者抽象类,添加具体的装饰功能。:定义被装饰对象和装饰者的共同接口。:通过多个装饰者类灵活组合不同功能。:在运行时添加或修改对象的行为。:实现组件接口的基础对象。
2025-03-11 15:36:27
562
原创 Netty——高性能、异步事件驱动的网络应用框架
使其成为高并发网络编程的首选框架。理解其线程模型、组件协作及内存管理机制,是掌握 Netty 的关键。Netty 是一个高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能服务器和客户端。技术,广泛应用于分布式系统、实时通信(如IM)、游戏服务器、物联网(IoT)等场景。的字节容器,支持堆内存和直接内存分配,提供更高效的内存管理(如内存池化)。:替代 Tomcat 处理高并发请求(如 Spring WebFlux)。中执行耗时操作(如数据库查询),改用异步任务或业务线程池。
2025-03-11 13:33:30
799
原创 java集合之Map
是一种用于存储**键值对(Key-Value Pair)**的集合,广泛应用于数据缓存、快速查找等场景。:数组 + 链表/红黑树(同HashMap),但使用CAS + synchronized实现线程安全。:多线程并发修改可能导致死循环(JDK1.7链表头插法)或数据丢失。:新建2倍容量数组,重新计算键的哈希并分配到新桶(耗时操作)。:将最近访问的条目移动到链表末尾,淘汰链表头部条目。:初始容量(默认16),负载因子(默认0.75)。:锁单个桶(链表头节点),减少锁竞争。:仅锁定当前桶,其他桶可并行操作。
2025-03-11 08:00:00
1331
原创 MySQL锁机制及底层原理深度解析
MySQL的锁机制通过精细的行级锁和间隙锁设计,结合MVCC,在保证事务隔离性的同时兼顾并发性能。理解其底层原理有助于:1.优化高并发场景:合理设计索引、事务和查询。2.诊断锁问题:快速定位死锁、锁超时原因。3.选择合适隔离级别:权衡一致性与性能。实际应用中,需结合EXPLAIN、锁监控工具及日志分析,持续优化数据库行为。
2025-03-10 11:33:32
1122
原创 java设计模式之适配器模式
适配器模式是解决接口不兼容问题的利器,尤其在以下场景中效果显著:• 系统需要集成外部组件或遗留代码。• 需要统一多个类的接口调用方式。• 希望在不修改原有代码的前提下扩展功能。通过合理使用适配器模式,可以提升系统的灵活性和可维护性,降低模块间的耦合度。
2025-03-10 09:21:25
628
原创 java设计模式之建造者模式
建造者模式是一种创建型设计模式,用于分步骤构建复杂对象,尤其适用于对象包含多个可选参数或需要灵活组合配置的场景。该模式通过将对象的构建与表示分离,使得同样的构建过程可以创建不同的对象表示。1.角色划分:◦ 产品(Product):最终要构建的复杂对象。◦ 抽象建造者(Builder):定义构建产品的各个步骤的接口。◦ 具体建造者(Concrete Builder):实现抽象建造者接口,提供具体的构建逻辑。◦ 指挥者(Director):控制构建流程(可选,可直接在客户端调用建造者)。◦ 客户端(C
2025-03-09 09:00:00
457
原创 MySQL性能调优
注意事项1. 避免过度优化:优先解决性能瓶颈最严重的部分。2. 基准测试:使用sysbench或自定义脚本验证调优效果。3. 灰度发布:生产环境调整配置时逐步验证。通过以上策略,可系统性提升MySQL性能,支撑高并发、大数据量场景。实际调优需结合业务特点,持续监控与迭代。
2025-03-08 09:00:00
1034
原创 MySQL锁机制详解
MySQL的锁机制是并发控制的核心,合理使用锁可以:• 确保数据一致性(如事务隔离级别下的ACID特性)。• 提升高并发场景下的性能(减少锁冲突)。需根据业务场景选择合适的锁策略,并结合索引优化、事务设计等手段避免性能瓶颈。
2025-03-07 11:11:24
1107
原创 java设计模式之原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需知道对象的具体创建细节。该模式主要用于创建对象的成本较高或者需要避免重复创建相同对象的场景。
2025-03-07 09:33:06
938
原创 java设计模式之策略模式
2. 实现具体策略类3. 创建上下文类4. 使用策略模式代码解释•策略接口 OperationStrategy:定义了一个 doOperation 方法,用于执行具体的运算操作。•具体策略类 AdditionStrategy、SubtractionStrategy 和 MultiplicationStrategy:分别实现了 OperationStrategy 接口,提供了加法、减法和乘法的具体实现。•上下文类 CalculatorContext。
2025-03-06 10:13:53
2123
原创 java设计模式之代理模式
• UserService 接口定义了一个 addUser 方法,目标对象和代理对象都需要实现该方法。• UserServiceImpl 类是目标对象,实现了 UserService 接口,完成具体的业务逻辑。• UserServiceProxy 类是代理对象,也实现了 UserService 接口,在 addUser 方法中调用了目标对象的 addUser方法,并在前后添加了额外的逻辑。• 在 main 方法中,创建了目标对象和代理对象,并调用代理对象的 addUser 方法。
2025-03-05 10:42:25
682
原创 java设计模式之观察者模式
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。在这种模式中,被观察的对象称为主题(Subject),依赖于主题的对象称为观察者(Observer)。
2025-03-03 08:52:13
425
原创 java设计模式之工厂模式
•简单工厂模式:适用于创建对象逻辑简单,产品种类较少的场景。•工厂方法模式:适用于需要根据不同条件创建不同类型对象,且需要满足开闭原则的场景。•抽象工厂模式:适用于创建一组相关的产品对象,且产品之间存在一定的关联关系的场景。
2025-03-01 20:25:45
221
原创 java设计模式之单例模式,七种单例模式都在这
在选择单例模式的实现方式时,需要根据具体的需求和场景来决定。如果对性能要求较高,且不需要延迟加载,可以选择饿汉式;如果需要延迟加载,且在多线程环境下使用,建议选择双重检查锁定或静态内部类的方式;如果需要防止反序列化重新创建对象,枚举是最好的选择。
2025-02-28 16:29:24
347
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人