- 博客(74)
- 收藏
- 关注
原创 重写和重载的区别
摘要: 重载和重写是Java中方法处理的两种重要机制。重载发生在同一类中,方法名相同但参数列表不同,在编译时确定调用哪个方法;重写发生在父子类间,子类重写父类方法时需保持方法签名一致,但可修改内部实现,在运行时动态绑定。重写需遵循"两同两小一大"原则:方法名和参数列表相同,返回值类型和异常范围不大于父类,访问权限不小于父类。两者的核心区别在于作用范围不同(同类/父子类)、参数要求不同(必须不同/必须相同)以及绑定时期不同(编译时/运行时)。
2025-08-18 10:22:02
323
原创 用 CountDownLatch 优雅控制 100 个线程
本文介绍了使用CountDownLatch实现100个线程统一启动和同步完成的方案。通过两个CountDownLatch分别控制开始信号(startSignal)和完成状态(doneSignal),实现所有线程准备就绪后同时启动,主线程等待所有工作线程完成的效果。该方案无需复杂锁机制,通过简单的await()和countDown()调用即可实现线程同步,具有实现简单、可靠性高、性能优越的特点,特别适合并发测试、批量任务处理等需要"统一启动、全部等待"的场景。
2025-07-31 18:13:48
238
原创 ReentrantLock + Condition 交替打印ABC
本文展示了使用Java多线程实现ABC交替打印的解决方案。通过创建一个Printer类,利用ReentrantLock和Condition条件变量控制三个线程的同步执行。每个线程(A、B、C)分别对应一个Condition,当state变量的值不匹配当前线程的序号时,线程会进入等待状态。每次打印完成后,state递增并唤醒下一个线程,形成严格的ABCABC...交替打印顺序。该方案确保了三个线程能够协同工作,按照指定顺序各打印10次字母,最终输出10组ABC序列。
2025-07-31 18:09:47
284
原创 银行家算法
银行家算法是一种经典的死锁避免算法,通过预先判断资源分配的安全性来确保系统处于"安全状态"。其核心数据结构包括可用资源向量、最大需求矩阵、已分配矩阵和需求矩阵。算法执行分为四个步骤:请求合法性检查、模拟资源分配、安全状态检查和实际分配决策。该算法能有效避免死锁但存在计算开销大、需预知最大资源需求等局限性,适用于资源固定的场景,在操作系统资源管理中具有重要参考价值。
2025-07-31 18:02:05
984
原创 深入理解 BIO、NIO、AIO
I/O模型对比:同步与异步、阻塞与非阻塞 摘要:本文对比了三种主要的I/O模型。BIO(阻塞I/O)采用同步阻塞方式,实现简单但资源消耗大;NIO(非阻塞I/O)通过多路复用实现同步非阻塞,提高了并发能力;AIO(异步I/O)采用异步非阻塞方式,通过回调机制实现最高效的资源利用。三种模型在编程复杂度、资源消耗和适用场景上各有特点,需要根据实际需求选择。同步/异步关注调用方式,阻塞/非阻塞关注等待状态,理解这些概念对开发高性能应用至关重要。
2025-07-25 16:26:19
506
原创 Dubbo的认识
本文介绍了分布式系统中Dubbo框架和RPC的核心概念。主要内容包括:1)Dubbo作为高性能Java RPC框架,具备远程调用、负载均衡和服务注册三大能力,适用于SOA架构;2)Dubbo架构包含服务提供者、消费者、注册中心等组件,支持多种负载均衡策略;3)RPC原理详解了远程调用的完整流程;4)分布式系统通过服务拆分提升性能;5)序列化与反序列化在对象传输中的作用。文章全面解析了分布式系统开发的关键技术点。
2025-07-24 17:52:33
697
原创 计算机网络
本文摘要: 本文系统介绍了计算机网络的核心协议与技术。首先分析了OSI与TCP/IP各层结构及功能,重点阐述了传输层的TCP与UDP协议。详细讲解了TCP的三次握手建立连接与四次挥手断开连接机制,以及TCP如何通过滑动窗口、流量控制、拥塞控制等实现可靠传输。此外,还介绍了HTTP状态码分类、Cookie与Session的区别、HTTP1.0与1.1的改进、URI与URL的概念,以及HTTP与HTTPS在安全性和资源消耗方面的差异。这些内容涵盖了计算机网络协议栈的关键技术要点。
2025-07-23 20:52:52
1145
1
原创 HTTPS证书体系,证书加密流程(通信体系)
HTTPS通过证书体系和加密机制实现安全通信。证书体系采用层级结构(根证书→中间证书→服务器证书),由CA机构背书验证服务器身份。通信过程分为TLS握手和数据传输两阶段:握手时通过非对称加密交换会话密钥,并完成证书验证;传输阶段则使用对称加密保证数据安全。这套机制解决了HTTP明文传输、身份伪装和数据篡改三大安全隐患,核心依赖客户端预装的根证书作为信任锚点,兼具安全性和效率。
2025-07-23 19:56:37
1553
原创 域名解析的过程
DNS域名解析是一个将域名转换为IP地址的层级查询过程。首先检查本地缓存(浏览器和系统缓存),若无结果则向本地DNS服务器查询。若仍无缓存,则按层级查询:从根服务器获取顶级域信息,再到顶级域服务器查询二级域,最后从权威服务器获取IP地址。解析结果会被各级缓存(如本地DNS服务器按TTL值缓存)以提高后续查询效率,最终将IP返回给用户设备进行连接。整个过程类似"网络通讯录"的多级查找机制。
2025-07-23 19:17:05
869
原创 Spring、Spring MVC、Spring Boot、Spring Cloud的联系和区别
Spring生态体系各组件分工明确:Spring提供IOC/AOP核心容器功能;SpringMVC基于Spring实现Web层MVC架构;SpringBoot通过自动配置简化Spring应用开发;SpringCloud在SpringBoot基础上构建微服务治理体系。四者呈递进关系,Spring是地基,SpringMVC专注于Web开发,SpringBoot实现快速构建,SpringCloud解决分布式问题,共同构成完整的Java企业开发生态。
2025-07-22 20:07:07
540
原创 Redis(二)
Redis持久化包括RDB快照和AOF日志两种方式,4.0版本支持混合模式。Redis事务通过命令打包执行但不支持回滚。缓存问题中,穿透可通过无效key缓存或布隆过滤器解决,雪崩可通过集群部署和随机失效时间避免。双删策略能保证缓存与数据库一致性。Redis集群有三种模式:主从复制实现读写分离,哨兵模式提供自动故障转移,Cluster模式通过数据分片实现扩展。不同模式适用于不同场景,共同提升Redis的高可用性、负载均衡和容灾能力。
2025-07-22 13:52:33
699
原创 Redis(一)
Redis是一个基于内存的C语言开发数据库,常用于缓存、分布式锁和消息队列。它通过内存存储提升响应速度,采用单线程模型简化维护,6.0版本后引入多线程优化网络IO性能。Redis支持多种数据结构(String、List、Hash、Set、SortedSet),满足计数、消息队列等场景需求。其采用定期删除+惰性删除策略管理过期数据,并提供8种内存淘汰机制(如LRU、LFU)应对内存不足问题,在性能和资源管理间取得平衡。
2025-07-21 17:09:32
944
原创 EXPLAIN:你的SQL性能优化透视镜
EXPLAIN是分析SQL性能的关键工具,通过展示查询执行计划帮助优化数据库操作。它显示访问表的方式(全表扫描或索引)、连接算法、执行顺序和预估成本等关键信息。主要关注type(访问类型)、rows(预估扫描行数)和Extra(额外信息)等字段,其中ALL和index表示低效扫描,Using temporary和Using filesort是常见性能瓶颈。通过添加合适索引、优化JOIN和子查询等方式可显著提升查询速度。EXPLAIN是诊断慢查询、验证索引效果的基础工具,结合统计信息和实际执行差异分析,为SQ
2025-07-20 16:27:23
1320
原创 正则表达式完全指南:从入门到实战
正则表达式是一种强大的文本匹配工具,用于查找、验证和提取特定模式的字符串。基础语法包括元字符(如.、^、$、、+等)、字符集合和特殊匹配(如\d、\w)。进阶特性涵盖分组捕获、非捕获分组、前瞻后顾以及贪婪/懒惰匹配。实战案例包括手机号验证(^1[3-9]\d{9}$)、链接提取(href=(["'])(.?)\1)和密码强度校验(需包含大小写字母、数字和特殊字符,至少8位)。正则表达式广泛应用于数据处理、表单验证和文本分析等场景。
2025-07-18 13:40:25
376
原创 树(Tree)
本文介绍了二叉树和红黑树的基本概念。二叉树部分说明了四种遍历方式:前序(根-左-右)、中序(左-根-右)、后序(左-右-根)和层次遍历。红黑树部分阐述了其作为近似平衡二叉查找树的五大特性:1)节点非红即黑;2)叶节点为黑;3)根节点为黑;4)红节点的子节点必须为黑;5)任意节点到叶节点的路径包含相同数量的黑节点。这些特性保证了红黑树的高效查找性能。
2025-07-18 13:15:24
244
原创 消息队列(MQ)
消息队列(MQ)是一种用于进程间通信的异步消息传递机制,具有提高系统性能、削峰限流和降低耦合性等优势,但也会带来可用性降低、复杂性增加等问题。JMS是Java平台的API标准,支持点对点和发布订阅模型;AMQP是跨语言的网络协议,提供更丰富的消息模型。主流消息队列中,ActiveMQ和RabbitMQ吞吐量较低但功能完备,RocketMQ和Kafka吞吐量高且分布式特性强,其中RabbitMQ延迟最低,Kafka在大数据领域应用广泛。不同队列在可用性、时效性和消息丢失风险等方面各有特点。
2025-07-17 13:50:18
807
原创 Java并发编程(二)
摘要:Java并发编程主要涉及锁机制、同步工具和线程池。锁包括Lock接口、AQS同步器、CLH队列等实现方式,分为独占锁和共享锁。同步工具有CountDownLatch和CyclicBarrier,前者用于线程等待,后者用于多线程同步。线程池通过Executor框架实现,核心参数包括corePoolSize、maximumPoolSize和workQueue。锁策略分为悲观锁(适合多写)和乐观锁(适合多读)。线程池创建建议使用ThreadPoolExecutor,避免使用FixedThreadPool等内
2025-07-17 10:43:49
1077
原创 Java并发编程(一)
本文主要探讨Java并发编程中的关键概念。首先分析了同步机制(synchronized锁、volatile、CAS)及其相关问题,包括锁升级过程、原子性和ABA问题。其次介绍了死锁的四个必要条件,并阐述了Java内存模型(JMM)的核心原理,包括happens-before原则的六条规则。最后对比了进程、线程和协程的特性差异,重点说明了线程调度机制和等待/通知模式的实现方式。全文系统性地梳理了Java并发编程的核心知识点,为提升程序性能提供了理论依据。
2025-07-16 17:57:47
942
原创 ThreadLocal结构
ThreadLocal是Java实现线程数据隔离的核心机制,其核心结构包含Thread、ThreadLocal和ThreadLocalMap三个关键组件。每个Thread对象内部维护一个ThreadLocalMap作为线程专属存储,ThreadLocal作为访问入口和键生成器,通过弱引用键设计防止内存泄漏。该机制采用定制化哈希表存储数据,其中Entry继承WeakReference确保ThreadLocal实例可被回收,但需开发者主动调用remove()避免value内存泄漏。系统提供探测式和启发式两种清理
2025-07-14 21:08:34
785
原创 进程、线程、协程
进程、线程和协程是三种并发编程模型。进程是独立的执行单元,资源隔离性好但开销大,适合高稳定性需求;线程共享进程资源,开销较小但需处理同步问题,适合高并发I/O任务;协程由用户态调度,切换开销极低,适合高并发网络服务和I/O密集型任务。选择时需考虑稳定性、并行计算和I/O等待等需求,协程适合I/O密集型场景,线程/进程更适合CPU计算并行。
2025-07-14 14:46:17
388
原创 代理模式:控制对象访问
摘要:代理模式通过引入代理对象控制对真实对象的访问,常用于延迟加载、权限控制等场景。示例中,ProxyImage作为RealImage的代理,实现按需加载图片功能(虚拟代理)。该模式解耦了客户端与真实对象,增强了安全性和性能,但可能增加响应延迟和代码复杂度。其他应用场景还包括保护代理(权限校验)和远程代理(网络请求封装)。
2025-07-13 19:51:16
246
原创 适配器模式:兼容不兼容接口
摘要:适配器模式通过转换接口解决不兼容问题,示例展示了将LegacyPrinter适配为ModernPrinter的过程。适配器类PrinterAdapter实现了目标接口并调用旧类方法,客户端无需修改即可使用新接口。该模式适用于整合遗留代码或系统升级,优点是代码复用和灵活性,但过度使用会导致系统混乱。(150字)
2025-07-13 19:47:01
292
原创 工厂模式:解耦对象创建
工厂模式是一种创建型设计模式,通过定义抽象产品接口和工厂类,将对象创建与使用分离。核心思想是让子类决定实例化哪个类。示例代码展示了如何创建圆形和矩形对象,客户端只需调用工厂方法而不需直接实例化具体类。该模式适用于需要动态扩展产品类型或处理复杂创建逻辑的场景,优点是实现解耦和易扩展,缺点是会增加代码复杂度且工厂类需要随新产品修改。
2025-07-13 19:39:39
160
原创 单例模式:确保全局唯一实例
单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点。该模式适用于需要全局唯一对象的场景,如配置管理、日志记录和连接池等。实现要点包括:私有静态实例、私有构造方法和双重检查锁定机制。示例代码展示了线程安全的单例实现,并演示了多线程环境下的使用。优点在于节省内存和避免重复创建,但需注意线程安全问题及可能导致的代码耦合问题。单例模式虽然简单实用,但应谨慎使用以避免过度依赖全局状态。
2025-07-13 19:32:25
298
原创 Java 21 虚拟线程
Java虚拟线程是轻量级并发模型,具有高效资源利用(仅需1KB内存/线程)和高吞吐量特性,适合I/O密集型应用。相比传统线程(1MB/线程),它能创建百万级线程,在阻塞时自动释放载体线程,显著提升性能。通过Thread.ofVirtual()和VirtualThreadPerTaskExecutor即可使用,代码示例展示了100个并行任务仅耗时45ms,且保持同步编程风格。虚拟线程由JVM调度,与传统线程API完全兼容,为高并发场景提供了更高效的解决方案。
2025-07-12 13:57:52
418
原创 深入理解JVM
JVM运行时数据区域分为线程独有(程序计数器、栈)和共享区域(方法区、堆)。对象内存分配可通过指针碰撞或空闲列表实现,由CAS或TLAB解决并发问题。对象由对象头、实例数据和对齐填充组成。垃圾回收采用可达性分析算法判断对象生死,使用分代收集理论优化回收效率。经典收集器包括CMS和G1,各有优缺点。类加载过程包括加载、验证、准备、解析和初始化五个阶段,采用双亲委派模型保证安全性。该模型可通过自定义类加载器破坏以实现特殊需求。
2025-07-11 17:33:47
504
原创 128陷阱
在Java中,对于范围在-128到127之间的整数,自动装箱时会使用缓存的对象,以提高性能和节省内存。这是因为Java认为这些值是常用的,因此通过缓存这些常用的。对象时,因为对于超出-128到127范围的值,相等性比较使用的是对象的引用比较,而不是数值比较。对象,而不是使用缓存中的对象。这可能导致意外的行为,特别是在比较。对象,可以减少对象的创建和提高性能。的值相同,但由于超出了缓存范围,它们实际上是两个不同的。然而,当超出这个范围时,每次自动装箱都会创建一个新的。为了避免这个陷阱,最好使用。
2025-07-08 17:56:32
237
原创 MyBatisPlus——代码生成器和多数据源
分别获取用户数据与商品数据,如果获取到说明多库模拟成功。目前我们就来模拟一个纯粹多库的一个场景,其他场景。加上主库数据源,读操作方法加上从库数据源,自动切。语句,我们该如何快速的解决这个问题呢,这个时候可。适用于多种场景:纯粹多库、读写分离、一主多从、说明:注释掉之前的数据库连接,添加新配置。库,这样每个库一张表,通过一个测试用例。、如果我们实现读写分离,将写操作方法。联查,我们就需要自己去编写代码和。换,是不是就能实现读写分离?的快速开发插件,为效率而生。所有问题,例如一些复杂的。但是在真正开发过程中,
2025-03-27 16:43:59
518
原创 MyBatisPlus——插件
MyBatisPlus自带分页插件,只要简单的配置即可实现分页功能测试结果:User(id=1,name=Jone,age=18,email=test1@baomidou.comUser(id=2,name=Jack,age=20,email=isDeleted=0)User(id=3,name=Tom,age=28,email=User(id=4,age=21,email=User(id=5,age=24,email=test5@ba。
2025-03-27 16:29:31
800
原创 MyBatisPlus——条件构造器和常用接口
Wrapper: 条件构造抽象类,最顶端父类: 用于查询条件封装,生成sql的where条件: 查询条件封装Update条件封装: 使用Lambda语法:用于Lambda语法使用的查询WrapperLambda更新封装Wrapper。
2025-03-27 16:13:39
328
原创 MyBatisPlus常用注解
经过以上的测试,在使用MyBatisPlus实现基本的CRUD时,我们并没有指定要操作的表,只是在Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表由此得出结论,在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?我们将表user更名为t_user,测试查询功能程序抛出异常,Table。
2025-03-27 16:04:04
1327
原创 MyBatisPlus基本CRUD
建议如果存在自定义通用 Service。语句设置不同的条件,若没有条件,则可以为该形参赋值。在实现插入数据时,会默认基于雪花算法的策略生成。中都已得到了实现,我们可以直接使用,接口如。通用 Service。类型的形参,此为条件构造器,可针。最终执行的结果,所获取的。中的方法,大多方法中都有。方法的可能,请创建自己的。,封装了常见的业务层逻辑。
2025-03-27 15:48:21
359
原创 MyBatisPlus入门案例
IDEidea2024.1JDKJDK8+构建工具:maven3.6.3MySQL版本:MySQL8.0SpringBoot2.7.1MyBatisPlus3.5.1普通Maven Java项目1、驱动类driverclassnamespringboot2.0(内置jdbc5驱动),驱动类使用:driverclassnamecommysqljdbcDriverspringboot2.1及以上(内置。
2025-03-27 15:35:19
886
原创 SpringBoot第三天
修改spring.datasource.type=com.alibaba.druid.pool.DruidDataSource。Springboot中提供了JdbcTemplateAutoConfiguration的自动配置。让我们使用yaml方式配置,创建application.yaml。我们同样可以在mybatis的接口上不加@Mapper注解,通过扫描器注解来扫描。在application.yaml中配置mybatis的信息。Mapper接口存放在cn.tx.mapper下。引入druid的依赖。
2025-03-14 10:50:43
1078
原创 SpringBoot第二天
th:id替换idth:text文本替换th:utext支持html的文本替换th:object替换对象th:value属性赋值th:onclick点击事件th:each属性赋值th:if判断条件th:unless和th:if判断相反th:href链接地址th:switch多路选择 配合th:case 使用th:caseth:switch的一个分支布局标签,定义一个代码片段,方便其它地方引用th:include布局标签,替换内容到引入的文件。
2025-03-13 22:59:42
971
原创 SpringBoot第一天
简化Spring应用开发的一个框架;整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案;优点:快速创建独立运行的spring项目以及与主流框架集成使用嵌入式的Servlet容器,应用无需打成war包,内嵌TomcatStarters自动依赖和版本控制大量的自动装配,简化开发,也可以修改默认值无需配置XML无代码生成开箱即用准生产环境的运行时应用监控与云计算的天然集成。
2025-03-13 22:30:54
1088
原创 SpringBoot项目的五种搭建方式
之前运行SpringBoot工程需要一个类,这个缺不了,自己手写一个就行了,建议按照之前的目录结构来创建,先别玩花样,先学走后学跑。类名可以自定义,关联的名称一切修改即可。:类名可以自定义,只要保障下面代码中使用的类名和你自己定义的名称一样即可,也就是run方法中的那个class对应的名称。参照标准的SpringBoot工程的pom文件,书写自己的pom文件即可。,<parent>坐标是导入的springboot依赖父工程。勾选自己创建项目的所有需要配置的信息 和idea创建一样。重点是<parent>
2025-03-09 19:53:57
499
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅