- 博客(50)
- 收藏
- 关注
原创 JDK8 中线程实现方法与底层逻辑详解
本文全面解析了JDK8中的线程实现方式及其底层原理。主要介绍了三种核心线程创建方法:继承Thread类、实现Runnable接口(推荐)和实现Callable接口,详细分析了各自的底层实现机制。深入探讨了线程池的实现原理,包括ThreadPoolExecutor的工作流程和核心组件,以及JDK8新增的CompletableFuture异步编程特性。最后从JVM层面剖析了线程模型,包括线程状态转换、创建开销等底层细节,为Java并发编程提供了全面的技术参考。
2025-12-18 09:00:00
1176
原创 在Windows系统上hprof文件是否可以删除
摘要:Java堆转储文件(.hprof)是IntelliJIDEA在发生内存错误时自动生成的诊断文件,默认保存在系统临时目录。该文件可以安全删除,不会影响软件运行,但频繁生成可能表明内存配置不足。删除方法包括直接删除或调整IDEA内存设置(-Xmx参数)。如需分析内存问题,可使用EclipseMAT等工具打开.hprof文件。建议定期清理这些文件,若IDEA频繁崩溃则需检查内存配置或插件兼容性。
2026-02-02 08:52:46
440
原创 BigDecimal除法异常:Non-terminating decimal expansion 解决方案
BigDecimal除法运算时遇到Non-terminating decimal expansion异常的解决方法:当BigDecimal进行除法运算产生无限循环小数时,需指定舍入规则。主要解决方案包括:1)使用divide()方法时明确设置舍入模式(如HALF_UP)和精度;2)通过MathContext指定精度。金融计算推荐保留2位小数并使用四舍五入,科学计算则需要更高精度。最佳实践是始终在除法中指定舍入模式,使用字符串构造BigDecimal,并建议封装工具类统一处理运算。遵循这些原则可确保精确计算并
2026-01-14 09:21:52
369
原创 深度解析:线程池如何实现“线程复用”原理
本文深入剖析了Java线程池的线程复用机制。通过与传统线程创建方式的对比,展示了线程复用如何减少资源开销、提高性能。核心分析包括:1)Worker类作为线程载体,通过runWorker方法实现任务循环执行;2)getTask方法实现任务获取策略,支持阻塞/超时等待;3)线程生命周期管理机制。源码解析表明,线程池通过while循环持续获取并执行任务,实现线程高效复用。这种设计避免了频繁创建销毁线程,显著提升了系统性能和资源利用率。
2026-01-14 09:00:00
521
原创 深入实践:如何根据实际需求定制自己的线程池
摘要:本文探讨定制线程池的必要性与实现方案。标准线程池存在无界队列导致OOM、线程数失控等风险,而定制线程池可实现资源可控、性能优化和故障隔离。文章提出从需求分析到参数设计的全流程方案,包括基于任务类型(CPU/IO密集型)的线程数计算公式,以及考虑内存限制和响应时间的队列容量设计策略。通过业务场景分析,给出不同场景(如用户注册、数据导出)的配置建议,强调根据业务特性定制核心参数的重要性,以实现高性能、高可用的线程池解决方案。
2026-01-13 14:19:02
162
原创 深度解析:JDK8中6种常见线程池与ForkJoinPool详解
本文详细介绍了Java并发编程中的6种线程池实现及其应用场景。主要内容包括:1. Executors工厂类提供的固定大小线程池、缓存线程池、单线程线程池、定时任务线程池、工作窃取线程池(Java8+)和单线程定时任务线程池的实现原理与特点;2. 重点分析了Java8引入的ForkJoinPool框架,包括其工作窃取算法、核心组件和使用示例;3. 提供了线程池选择指南和最佳实践,强调避免无界队列、合理设置线程数等注意事项。文章通过代码示例展示了各种线程池的具体应用场景,帮助开发者根据任务特性选择合适的线程池实
2026-01-13 09:00:00
1075
原创 深度解析:JDK8中线程池的核心参数与四种拒绝策略
本文深入解析Java线程池的核心参数与拒绝策略。详细介绍了ThreadPoolExecutor的7个关键参数:核心线程数、最大线程数、线程空闲时间、时间单位、工作队列、线程工厂和拒绝策略处理器。重点剖析了四种拒绝策略的特点及适用场景:AbortPolicy(抛出异常)、CallerRunsPolicy(调用者执行)、DiscardOldestPolicy(丢弃最旧任务)和DiscardPolicy(静默丢弃)。通过执行流程分析和实际示例,提供了线程池配置的最佳实践,包括参数设置建议、监控方法和常见陷阱规避,
2026-01-12 16:18:45
1297
原创 在JDK8中,线程池参数动态调整:场景与实践指南
JDK8线程池动态调整摘要:线程池参数动态调整适用于业务流量波动、大促活动、多租户隔离和云原生环境等场景。核心实现包括基于时间/负载自动调节线程数、渐进式调整策略和综合监控指标(队列使用率、活跃线程数等)。最佳实践建议采用分步调整避免剧烈变化,并合理选择调整时机。需注意核心线程减少不会立即生效、队列容量不可动态调整等限制。通过智能监控和弹性伸缩,可实现资源的高效利用和系统稳定。
2026-01-12 10:00:00
840
原创 为什么使用线程池?JDK8中线程池的五大优势与实践指南
本文深入探讨了JDK8中线程池相比手动创建线程的五大优势:降低资源消耗、提高响应速度、增强可管理性、避免资源耗尽风险及提供丰富功能特性。详细介绍了ThreadPoolExecutor核心组件、参数配置及四种内置线程池类型,并给出实践建议,包括线程池选择、参数配置、自定义线程工厂和优雅关闭策略。通过性能对比测试验证了线程池的优越性,最后针对常见问题提供解决方案。文章强调在生产环境中使用线程池的必要性,为开发者提供了全面的线程池使用指南。
2026-01-12 09:00:00
299
原创 Java线程演进:从线程池到虚拟线程的技术革命
摘要:JDK8线程池通过资源复用、统一管理和拒绝策略显著提升性能,相比手动创建线程可减少95%内存消耗。JDK17/21引入的虚拟线程实现革命性突破,采用M:N调度模型,内存开销仅KB级,支持百万级并发,特别适合高I/O场景。性能测试显示虚拟线程在HTTP服务中内存减少90%、吞吐提升9.6倍。最佳实践包括使用VirtualThreadPerTaskExecutor、避免线程池缓存虚拟线程,以及与响应式编程结合使用。虚拟线程使同步代码更简洁,同时保持异步性能优势。
2025-12-26 10:00:00
1125
原创 深度解析:JDK8 中多线程性能问题
本文分析了JDK8环境下多线程性能下降的根源及解决方案。主要问题包括:1)上下文切换开销,线程过多导致CPU缓存失效;2)锁竞争与同步开销;3)内存屏障影响指令优化;4)伪共享导致缓存行频繁失效;5)线程创建销毁开销。JDK8特有问题是并行流不当使用和CompletableFuture回调地狱。诊断工具推荐jstack、pidstat等,关键指标包括上下文切换率、CPU使用率等。解决方案包括合理控制线程数、使用线程池、避免锁竞争、处理伪共享等优化措施。
2025-12-26 09:00:00
388
原创 Spring Boot 多线程演进:从 2.0 到 4.0 的并发编程变革
摘要:本文系统分析了SpringBoot各版本在多线程和并发处理方面的演进。SpringBoot 2.x以传统线程池为主,3.x全面拥抱响应式编程并支持虚拟线程预览,4.x(预计)将正式集成虚拟线程和结构化并发。文章详细对比了各版本的线程实现方式、线程安全措施及迁移考量,指出从线程池到响应式再到虚拟线程的技术演进趋势,并针对不同应用场景给出版本选择建议。传统应用适合2.x稳定版,高并发I/O场景推荐3.x+虚拟线程,云原生应用可选择响应式模型,前沿项目可等待4.x的结构化并发特性。
2025-12-25 10:00:00
1285
原创 深度解析:Spring Boot 项目线程安全-从单机到集群的防御指南
本文探讨了SpringBoot高并发服务中的线程安全问题及其解决方案。文章首先分析了SpringBoot默认的单例Bean并发模型,指出无状态Bean天生线程安全,而有状态Bean存在风险。随后详细列举了SpringBoot2中的高危场景,包括可变成员变量、共享集合使用不当、异步任务资源竞争等。通过对比SpringBoot3的新特性,指出其响应式编程和非阻塞架构带来的改进。最后提出了构建线程安全应用的防御策略,包括无状态设计、线程局部存储、锁机制运用等,并强调全面测试的重要性。全文为开发者提供了从编码到架构
2025-12-25 09:00:00
2111
原创 深度解析:JDK8中线程安全问题的三大类型
摘要:线程安全问题是并发编程中的核心挑战,主要表现为原子性、可见性和有序性问题。原子性问题指操作被中断导致数据不一致;可见性问题指线程修改对其他线程不可见;有序性问题指指令重排序引发逻辑错误。解决方案包括:使用synchronized同步块保证三大特性;volatile解决可见性和有序性;原子类通过CAS保证原子性。Java内存模型通过happens-before规则建立线程操作间的可见性保证。实际开发中需根据场景选择合适的同步机制,正确处理复合操作和指令重排序问题。
2025-12-24 10:00:00
535
原创 生产者消费者模式的 JDK8 实现方式详解
生产者消费者模式是一种多线程协作设计模式,通过共享缓冲区解耦生产者和消费者。常见实现方式包括:1)使用synchronized+wait/notify实现基础同步;2)利用Lock+Condition提供更灵活的线程控制;3)推荐使用BlockingQueue实现,简单安全;4)通过Semaphore控制资源访问;5)Exchanger适用于单生产者单消费者场景。不同方案各有特点,BlockingQueue因其线程安全和易用性成为首选方案。
2025-12-24 09:00:00
227
原创 深度解析:JDK8中wait、notify、notifyAll的使用艺术与陷阱
Java线程通信核心方法wait()、notify()和notifyAll()的正确使用要点: 必须在synchronized同步块中调用这三个方法,否则会抛出IllegalMonitorStateException异常 使用wait()时必须: 在while循环中检查条件,避免虚假唤醒 正确处理InterruptedException 可选择带超时参数的wait(long)方法 notify()与notifyAll()的选择策略: notify()只唤醒一个线程,适用于单生产者-单消费者场景 notify
2025-12-23 10:00:00
710
原创 网络协议的各自特点和使用场景
本文概述了互联网协议的分层架构与核心协议。TCP/IP四层模型包括应用层(HTTP、FTP、DNS等)、传输层(TCP、UDP)、网络层(IP、ICMP)和网络接口层(以太网、WiFi)。文章详细介绍了各层协议的特性与应用场景,对比了TCP的可靠性与UDP的低延迟优势,并探讨了HTTP/3、QUIC等现代协议发展趋势。最后提供了协议选择建议和网络调试工具,帮助读者根据传输需求(可靠性/实时性)和环境条件(带宽/安全性)选择合适协议。
2025-12-22 10:00:00
879
原创 深度解析:JDK8中如何正确停止线程与volatile陷阱
摘要:Java线程停止的正确实践 本文深入探讨了JDK8环境下线程停止的常见误区与正确方法。早期废弃的stop()方法会立即释放锁,导致数据不一致和资源泄漏;看似可靠的volatile标记位方案在阻塞操作和CPU密集型任务中存在响应延迟问题。正确的做法是采用Java中断机制:通过interrupt()发送中断请求,在循环中检查isInterrupted()状态,并妥善处理InterruptedException异常。特别要注意,阻塞方法如sleep()和I/O操作需配合中断处理,而同步锁等待无法被中断。优雅
2025-12-22 09:00:00
414
原创 深度解析:JDK8中线程实现的本质与最佳实践
JDK8中创建线程本质上只有一种方式:实例化Thread类并调用start()方法。虽然表面上有继承Thread、实现Runnable或Callable三种方式,但都是定义线程执行逻辑的不同策略。Runnable方式更具优势:避免单继承限制,实现职责分离,支持资源共享,与线程池完美兼容,更灵活且内存开销更小。Thread类本身实现了Runnable接口,其内部通过target字段调用传入的Runnable实现,而继承Thread类会直接覆盖run()方法。因此,推荐优先使用Runnable接口方式创建线程。
2025-12-19 10:00:00
744
原创 Java 线程演进史:从 JDK8 到 JDK21 的并发编程革命(二)
本文概述了Java线程从JDK8到JDK21的演进历程。JDK17首次引入虚拟线程(预览版),通过轻量级线程实现高并发,相比传统线程具有更低的内存占用和创建成本。JDK21正式发布虚拟线程,增强API并引入结构化并发和ScopedValues等新特性。在底层架构上,虚拟线程采用JVM用户态调度,通过ForkJoinPool和自动卸载机制提升性能。线程池实现也演进为无需调优的虚拟线程执行器。整体架构从操作系统调度转向JVM管理,内存管理改进为堆存储的按需分配模式,显著提升了并发性能和资源利用率。
2025-12-19 09:00:00
839
原创 Java 线程演进史:从 JDK8 到 JDK21 的并发编程革命(一)
Java并发编程经历了四个发展阶段:JDK8及之前基于操作系统线程的1:1模型,提供Thread、Runnable等基础API;JDK9-16增强CompletableFuture、引入Flow API等响应式编程支持;JDK17-20开始预览虚拟线程特性;JDK21+正式推出虚拟线程。传统线程模型存在创建成本高、数量受限等问题,而虚拟线程通过轻量级实现显著提升了并发性能。JDK9在保持原有线程模型基础上,通过改进API为后续并发革新奠定了基础。
2025-12-18 11:00:00
304
原创 线性代数入门讲解:综合应用示例
摘要:本文通过求解线性方程组示例,介绍了线性代数的核心概念。首先通过行列式计算判断矩阵可逆性,运用高斯消元法求解方程组得到x=1,y=2的解。文章总结了向量运算、矩阵表示与运算、线性方程组求解方法以及行列式的重要性等基础内容,这些知识为深入学习向量空间、线性变换等高级概念奠定基础。
2025-12-12 10:00:00
286
原创 线性代数入门讲解:第三部分:行列式
本文介绍了行列式的核心概念与应用。行列式是方阵的标量值,具有重要的几何意义:二阶行列式表示向量张成的平行四边形有向面积,三阶行列式对应平行六面体的有向体积。文章详细说明了2×2和3×3行列式的计算方法,并总结了行列式的关键性质,包括转置不变性、行变换影响、可逆性判定条件以及乘积的行列式性质。通过具体示例,展示了行列式在计算几何图形面积体积中的实际应用。
2025-12-11 14:30:00
383
原创 线性代数入门讲解:第二部分:线性方程组
本文介绍了线性方程组的求解方法。主要内容包括:1)线性方程组的一般形式和矩阵表示;2)高斯消元法的具体步骤,通过初等行变换将增广矩阵化为行阶梯形后回代求解;3)通过示例演示了求解过程;4)分析了方程组解的三种情况:唯一解(系数矩阵满秩)、无穷多解(存在自由变量)和无解(出现矛盾方程)。文章系统阐述了线性方程组的基本解法及其解的存在性判断标准。
2025-12-11 10:00:00
355
原创 线性代数入门讲解:第一部分:向量与矩阵运算
本文摘要介绍了向量与矩阵的基本概念及运算。向量定义为有序数组,包含加法、数乘、内积和长度计算;矩阵是矩形数阵,涉及加法、数乘、乘法和转置运算,特别指出矩阵乘法不满足交换律。通过示例说明了各类运算的具体应用。
2025-12-10 18:00:00
657
原创 关于模型蒸馏的论文
arXiv模型蒸馏研究概览 本文整理了arXiv上关于模型蒸馏的最新研究进展,涵盖自动化蒸馏流程、数据选择策略和理论框架等方向。重点论文包括:自动化LLM蒸馏框架Stratos、基于样本过滤的AdaSPEC解码器优化、探究数据源质量影响的SFT研究,以及建立蒸馏理论框架和探讨过参数化现象的论文。这些研究从不同角度推进了模型蒸馏技术的发展,为高效模型压缩和知识迁移提供了新思路。建议通过关键词组合或指定领域类别(如cs.LG、cs.CL)在arXiv进一步检索相关研究。
2025-10-23 14:41:54
394
原创 模型蒸馏都有哪些方式
模型蒸馏技术主要分为三类:按知识类型分类(基于输出、特征和关系的蒸馏),按结构分类(离线、在线和自蒸馏),以及按教师模型数量分类(单一、多教师和助教蒸馏)。基于输出的蒸馏让学生模型模仿教师模型的输出分布,基于特征的蒸馏学习中间层特征,基于关系的蒸馏则关注样本间关系。离线蒸馏分阶段训练,在线蒸馏同步更新师生模型,自蒸馏让模型自我优化。此外,多教师蒸馏融合多个专家知识,助教蒸馏通过中间模型缩小能力差距。这些方法可单独或组合使用,根据任务需求灵活选择。
2025-10-23 14:34:00
556
原创 什么是模型的蒸馏
模型蒸馏是一种让小型"学生模型"模仿大型"老师模型"的知识迁移技术。核心思想是通过让小模型学习大模型的"软标签"(概率分布输出)而非原始数据的硬标签,实现知识的高效传递。这种方法不仅能压缩模型体积,便于在资源受限设备上部署,还能提升小模型性能。蒸馏过程包含训练大模型、知识迁移(通过温度参数软化输出)、定义混合损失函数等步骤。相比传统训练,蒸馏能学习更丰富的类别关联信息,最终获得轻量化但性能接近大模型的小型模型,在移动端AI等领域具有重要应用价值。
2025-10-23 14:30:31
1236
原创 Springboot 中自动配置相关的注解
这些注解覆盖了Spring Boot应用程序开发中的许多方面,包括启动和配置、组件定义、请求处理、依赖注入、条件装配、缓存、定时任务、异步执行、事务管理以及测试等。通过合理使用这些注解,可以极大地提高开发效率和应用程序的可维护性。)外,还有许多其他类型的注解用于不同的目的和功能。在Spring Boot中,除了。和与自动配置相关的注解(如。,虽然用户不直接使用。
2024-08-27 17:00:16
603
1
原创 @Configuration 和 @AutoConfiguration 的区别
在类加载的层面上,和的主要区别在于它们是如何被 Spring Boot 识别和处理的。类是用户显式定义的,而类(及其效果)则是由 Spring Boot 框架根据项目的依赖和配置自动识别和应用的。然而,从用户的角度来看,重要的是理解如何编写自己的类以及如何利用 Spring Boot 的自动配置功能来简化配置过程。
2024-08-27 16:50:52
2314
原创 Mybatis 如何判断表是否存在
在MyBatis中直接判断表是否存在并不是一个内置的功能,因为MyBatis主要关注于ORM(对象关系映射)的查询、更新、删除和插入操作,而不是数据库结构的检查。但是,你可以通过几种方式来实现检查表是否存在的功能。
2024-08-19 15:55:00
1698
原创 缺少 @MapKey 注解
在 MyBatis 的 Mapper 层编写查询方法,并希望以 Map 集合的形式接收返回结果时,如果直接使用 Map 作为返回值,并且期望 Map 的键具有某种特定的含义(比如行ID或特定列作为键),可能会遇到“@MapKey is required”的提示。因此,选择使用 Map 集合来接收每行的数据,其中 Map 的键为列名,值为对应的列值。这意味着该表的字段(如列名、数据类型等)不是预定义的,而是根据表单的内容动态生成的。这样每个 Map 代表一行数据,Map 的键是列名,值是对应的数据。
2024-08-19 15:26:23
882
原创 SpringBoot接口访问频率限制的实现方式(四)
本文全面介绍了在Spring Boot应用中实现接口访问频率限制的多种策略,包括基于过滤器、拦截器的方法,以及使用第三方库如Bucket4j的高级实现。合理的限流策略不仅能够抵御恶意攻击,还能增强系统的稳定性和用户满意度。在具体实施时,应根据业务特点选择合适的限流算法和实现技术,并进行相应的性能优化,以确保系统运行的高效率和高可靠性。
2024-08-13 14:47:21
599
原创 Springboot 项目 整合 MySQL 动态查询数据库表的字段名和字段值(一)
在使用Spring Boot结合MySQL数据库的场景中,有时我们需要查询某个表的所有字段名(列名)及其对应的值,并将这些数据以Map的形式返回。这种需求通常出现在动态数据处理或API响应中,尤其是当你无法预先知道将会有哪些字段时。需要注意的是,JDBC并不直接支持从SQL查询中返回字段名到值的Map集合。虽然JDBC的。
2024-08-12 11:48:25
962
原创 SpringBoot接口访问频率限制的实现方式(二)
Bucket4j是一个Java实现的高性能限流库,它支持多种限流算法,如令牌桶算法。通过使用Bucket4j,可以轻松地在Spring Boot应用中实现复杂的限流逻辑,并且它还提供了丰富的配置选项和统计功能。过滤器是Java Web应用中常用的一种组件,它可以在请求到达Servlet之前对请求进行预处理。通过在过滤器中实现限流逻辑,可以对所有的HTTP请求进行统一的限流控制。相比于过滤器,拦截器可以更加细粒度地控制请求,适用于需要针对某些特定接口进行限流的场景。
2024-08-12 11:37:19
780
原创 SpringBoot接口访问频率限制的实现方式
接口访问频率限制是通过在一定时间内限制用户对接口的访问次数来实现的。常见的限流算法包括令牌桶算法(Token Bucket)、漏桶算法(Leaky Bucket)、固定窗口计数器(Fixed Window Counter)和滑动窗口计数器(Sliding Window Counter)等。在Spring Boot中,我们可以通过多种方式来实现接口的限流,如使用过滤器、拦截器或者借助第三方库。针对这个知识会引出人生三大问题,为什么,怎么做,如何更好。
2024-08-09 17:25:12
716
1
原创 Spring 框架获取请求 IP
在处理HTTP请求时,获取原始IP地址有时是必要的,特别是在反向代理或负载均衡器后面运行应用程序时。原始IP地址指的是客户端(用户)的IP地址,而不是代理服务器的地址。
2024-08-09 17:08:52
1092
原创 利用 Nginx 代理请求后如何获取客户端真实 IP 地址
当接收到 request 的请求 IP 后,获取的都是服务器的地址,导致不能区分出请求来源。但是当请求通过 NGINX 道理后只能获取到代理服务器的 IP ,不能获取到真实 IP。业务需求中会有获取客户端 IP 的情况,可以通过 request 方法获取到。
2024-01-13 15:05:09
2068
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅