Java Basic
文章平均质量分 70
长河
为天地立心,为生民立命,为往圣继绝学,为万世开太平.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
XXL-JOB 从本地快速上手到核心架构深度解析
XXL-JOB分布式任务调度框架实战指南 摘要:XXL-JOB作为轻量级分布式任务调度框架,通过调度中心与执行器分离的设计实现高效任务调度。本文从本地部署入手,详细介绍了环境准备、数据库初始化和管理平台配置等基础操作。深入解析了框架的核心机制,包括自动注册与心跳、端口分工、8张核心数据表的作用等关键技术点。重点剖析了调度中心与执行器的交互流程,以及分片广播、故障转移等高级特性。文章还提供了任务开发示例代码,帮助开发者快速掌握自定义任务开发方法。最后总结了XXL-JOB的高可用设计思想及其在企业级应用中的优势原创 2026-05-01 16:49:46 · 392 阅读 · 0 评论 -
踩坑记:Spring 启用虚拟线程后 100 并发就卡死?根源与解决方案
摘要:JDK19虚拟线程特性在Spring Boot 6.1+应用中启用后,部分开发者遇到100并发压测时系统卡死问题。问题根源在于默认ForkJoinPool载体线程池容量不足,同步JDBC操作会阻塞载体线程。解决方案需从三方面优化:1)自定义载体线程池;2)扩容数据库连接池;3)优化SQL减少阻塞。验证表明,虚拟线程需结合业务特性调整配置才能发挥高吞吐优势,特别是IO密集型场景需特别注意线程池和连接池的适配。原创 2026-03-04 17:16:30 · 436 阅读 · 0 评论 -
Java线程池
摘要:本文深入探讨Java线程池在生产环境中的实践应用与风险防范。主要内容包括:1.适用场景分析:针对IO密集型、CPU密集型、异步解耦和定时任务提供配置策略;2.常见陷阱及解决方案:如无界队列OOM风险、父子任务死锁、线程泄漏、ThreadLocal污染等;3.高级技巧:动态线程池调整、线程隔离、全链路监控、优雅关闭等最佳实践;4.源码级原理剖析:ctl状态机、Worker类实现等底层机制。文章强调必须手动配置线程池参数,采用有界队列和合理拒绝策略,并提供完整的监控方案和异常处理机制,确保系统稳定性和性能原创 2026-02-02 08:42:35 · 1098 阅读 · 0 评论 -
Spring Boot 监控实战:集成 Prometheus 与 Grafana,打造全方位监控体系
本文介绍了Grafana和Prometheus两大监控工具及其在Spring Boot应用监控中的应用。Grafana是一个开源的仪表盘可视化工具,支持多种数据源;Prometheus是一个时间序列数据库,专门用于系统监控。二者配合使用,Grafana通过查询Prometheus获取数据并可视化展示。文章详细说明了如何在Spring Boot项目中集成Prometheus,配置Grafana数据源,创建监控仪表盘,并设置告警规则。同时提供了JVM核心指标的PromQL查询示例,涵盖内存、GC、线程等关键维度原创 2026-01-13 21:22:13 · 750 阅读 · 1 评论 -
解密Java性能瓶颈:一个ThreadLocal引发的10倍性能提升实战
摘要: 在高并发后端服务中,不当使用ObjectMapper导致性能问题:频繁创建实例引入GC压力与CPU开销。优化历程从全局单例(减少对象创建)到ThreadLocal隔离(消除锁竞争),最终实现吞吐量提升10倍,延迟降低80%。ThreadLocal适用于昂贵对象复用或非线程安全对象隔离,但需警惕内存泄漏(及时调用remove())。案例启示:性能优化常始于基础细节,而非复杂架构;合理运用对象复用与线程隔离模式,可显著提升系统效率。原创 2025-11-03 11:03:10 · 656 阅读 · 5 评论 -
雪花算法分布式锁竞争事故分析与解决方案
本文分析了分布式系统中雪花算法ID生成时的Redis锁竞争问题。事故表现为服务启动失败和ID生成异常,主要原因是开发环境共享Redis导致datacenterId分配冲突。通过源码分析发现:1)雪花算法采用主动争抢的ID分配机制;2)Redis锁服务无重试且长期续期;3)本地与线上环境共享资源。解决方案包括:1)分离本地与线上Redis实例;2)优化ID分配逻辑,增加区间配置和重试机制;3)调整锁超时参数和监控策略。优化后,服务启动成功率和锁竞争问题显著改善。经验表明,分布式系统需严格隔离环境,精细管理有限原创 2025-11-03 11:02:40 · 1192 阅读 · 5 评论 -
从静态到智能:用函数式接口替代传统工具类
本文探讨了Java开发中从静态工具类向函数式接口的演进。传统静态工具类存在行为固定、难以测试等缺陷,而Java8引入的函数式接口(如Predicate、Function)通过Lambda表达式实现了动态规则切换、易测试性和灵活组合。文章通过验证器、输入处理流水线等实例展示了函数式编程的优势,并提供了渐进式迁移方案:保留旧方法→添加函数式版本→方法引用兼容→组合逻辑→最终替换。这种转变提升了代码的可维护性和扩展性,更符合现代Java开发理念。迁移过程中应分模块逐步实施,同时加强团队培训。原创 2025-09-02 20:59:39 · 1556 阅读 · 4 评论 -
spring security入门
SpringSecurity最适合需要复杂权限控制(RBAC)、多认证方式集成、OAuth2生态构建及高安全标准的企业级应用。对于微服务API保护,即使只有几个接口,也建议优先使用SpringSecurity的OAuth2资源服务器模块,通过JWT验证实现零代码安全防护。本教程演示了如何快速构建一个安全的REST API:配置无状态安全策略、创建JWT工具类、实现认证过滤器和API端点。测试表明,系统能有效区分公开/私有端点,并通过Token验证保护API访问。SpringSecurity为现代微服务提供了原创 2025-09-02 20:59:03 · 831 阅读 · 0 评论 -
从惊艳到教训:Java Lambda 在真实生产环境的反思与最佳实践
摘要:Java Lambda表达式和StreamAPI带来的简洁性背后隐藏着严重的生产风险。本文基于两起真实事故:一是NullPointerException因Stream堆栈信息混乱导致定位困难;二是批处理作业因sorted()操作引发性能崩溃,测试显示Stream方案比传统循环慢15倍、内存高2.7倍。分析揭示了Stream在调试性、性能和可维护性上的三大挑战:堆栈失真、GC压力大、业务逻辑碎片化。建议在核心业务和高负载场景回归显式循环,提出分阶段处理、防御性编程等2025稳健编码原则,强调"原创 2025-08-01 08:59:04 · 1089 阅读 · 0 评论 -
java汉字拼音首字母的获取解决方案
对于汉字首字母的拼音获取,可以使用pinyin4j 2.5.0.jar 进行解决.封装了一个工具类package com.util;import net.sourceforge.pinyin4j.PinyinHelper;import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;import net.sourcef...原创 2018-05-22 11:10:42 · 13803 阅读 · 7 评论 -
Java实现RSA非对称加密
public class TestRSA { private static final String publicKeyStr = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3jg5eFRbBNeIg20xM6Ukn8Mu4WmvqxdSbmjg74T4o52zfUP/RZfIwx+7yt3aaEuxqkgTagaV1oR91uR6IQqmk++05gHzgigIK8G+eX9fGqnZWDaugH5HUteTyY8SjvCRY9gxuaP6j...原创 2021-10-02 09:59:06 · 4174 阅读 · 2 评论 -
Java的Object和Kotlin的Any之间的关系
Java的Object和Kotlin的Any之间的关系原创 2022-06-02 17:33:27 · 1187 阅读 · 2 评论 -
java连接zookeeper实现zookeeper的基本操作
Java服务端连接Zookeeper,进行节点信息的获取,管理…,整理成一个基本工具,添加依赖:<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.3.6...原创 2018-09-05 11:34:07 · 24909 阅读 · 2 评论 -
java根据秒获取天小时分钟
public static String parseSeconds(Long seconds) { if (seconds > 0 && seconds <= 60) { // 秒 return "1分钟"; } else if (seconds > 60 && seconds <= 3600) { // 分钟 return (seconds / 60) + "分钟" ; } else if (secon.原创 2021-03-02 10:43:29 · 1159 阅读 · 2 评论 -
sleep(0)作用
假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?操作系统中,CPU竞争有很多种策略。Unix系统使用的是时间片...转载 2019-03-12 16:59:32 · 4884 阅读 · 0 评论 -
由浅入深理解Java线程池及线程池的如何使用
前言多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担。线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory。即便没有这样的情况,大量的线程回收也会给GC带来很大的压力。为了避免重复的创建线程,线程池的出现可以让线程进行复用。通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线...转载 2018-08-15 14:27:10 · 570 阅读 · 0 评论 -
google protobuf3实践教程
google 的 protobuf 一个及其快速,以及好用的序列化框架,支持多语言之间,我们今天就使用java来进行尝试.by the way,为什么要序列化,不序列化不行吗?这么麻烦,序列化是一种对象持久化的手段,主要是用在网络传输、RMI等场景中,为了数据的传输,所以才需要进行序列化,一般的使用中确实不用序列化.笔者使用的是win10,jdk1.8,idea.下载配置prot...原创 2018-08-26 09:42:11 · 2839 阅读 · 0 评论 -
SpringBoot集成JWT实现token验证
TODO 先把坑挖在这里, 回头来填上, 这篇写的真懒, 我回改的Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一...原创 2019-02-19 15:30:13 · 3120 阅读 · 0 评论 -
fastjson解析
听闻阿里的fastJson特别的厉害.就下载了,稍微的试了一下:本次使用:fastjson-1.2.8.jar本次只是比较简单的对象和json之间的转换,没有涉及到复杂对象与json之间的转换.有两个实体类,User和GroupBean,本次暂时只是涉及到User类public class User { private String id; private Str...原创 2017-04-01 19:57:31 · 1057 阅读 · 0 评论 -
重写equals方法后重写hashCode方法的必要性
1、首先我们看看对象默认的(Object)的equals方法和hashcode方法public booleanequals(Object obj) {return(this== obj);}public native inthashCode();对象在不重写的情况下使用的是Object的equals方法和hashcode方法,从Object类的源码我们知道,默认的equals...转载 2018-10-31 16:26:41 · 3456 阅读 · 0 评论 -
Jackson使用详解
Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社区相对比较活跃,更新速度也比较快, 从 Github 中的统计来看,Jackson 是最流行的 json 解析器之一。Spring MVC 的默认 json 解析器便是 Jackson。Jackson 优点很多。Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;原创 2024-07-01 16:24:15 · 1670 阅读 · 0 评论 -
SpringBoot web项目性能监控
用于获取 Java 应用程序的内存堆转储(heap dump)和线程转储(thread dump)。原创 2024-05-06 09:18:03 · 414 阅读 · 0 评论 -
SpringBoot2升级到SpringBoot3总结
我们这边的项目大多数都是Kotlin+SpringBoot2.X的技术栈,现在要全部升级到最新的SpringBoot3.2.2或者SpringBoot3.2.3,还是以Kotlin为主。最近公司在做监控日志平台的迁移,从NewRelic迁移到Dynatrace,为了配合迁移,有一个前提就是把SpringBoot2升级到SpringBoot3。首先做的第一件事:把JDK11升级到JDK17,以及把kotlin升级到1.9.21。注意查看升级后的驱动的依赖版本,注意出现不兼容的情况。等等,还有一些就不列举了。原创 2024-04-01 09:02:12 · 1816 阅读 · 0 评论 -
再谈jdk的代理
第408行的注释, 说如果没有就使用ProxyClassFactory创建一个,否则直接从缓存里面拿, 我们不看缓存的拿去, 就是一个Map, 没事好看的. 看看这个ProxyClassFactory类.他是静态的内部类.我们模仿第二种方式,动态的生成一个.java文件, 再编译成.calss文件,最后加载到jvm中,生成对象,调用新的对象的方法,就得到的增强的目的,而且对用户是透明的.缺点很明显, 需要继承, 而且随着功能的增加, 要不断的继承, 体系混乱,越来越复杂. 最后谁就不懂了.原创 2023-11-02 14:26:41 · 235 阅读 · 0 评论 -
2.并发编程
文章迁移自语雀。并发编程2原创 2024-03-01 17:39:21 · 1131 阅读 · 0 评论 -
1.并发编程
并发编程原创 2024-02-02 10:34:56 · 908 阅读 · 0 评论 -
Java 21 新功能展示(含示例)
Java 21 于 2023 年 9 月 19 日发布,是 Oracle 标准 Java 实现的下一个长期支持(LTS)版本。Java 21 具有以下 15 项功能。字符串模板(预览版) [JEP-430]序列集合 [JEP-431]代 ZGC [JEP-439]记录模式 [JEP-440]开关的模式匹配 [JEP-441]外来函数和内存 API(第三次预览) [JEP-442]未命名模式和变量(预览) [JEP-443]虚拟线程 [JEP-444]原创 2023-10-07 09:43:36 · 1497 阅读 · 0 评论 -
写给Javaer看的Kotlin教程
三元:val max = if (a > b) a else bfun OfferType.Companion.fromString(str: String?): OfferType {//字符串可能为空 if (str?.isBlank() == true) { return OfferType.STUDIO_FLOW } for (type in OfferType.values()) if (type.str.eq...原创 2022-04-06 09:27:02 · 3740 阅读 · 0 评论 -
Java8的函数式接口入门
import java.util.Arrays;import java.util.List;import java.util.function.Consumer;/** * 消费型接口,接收一个参数,并处理,不返回 */public class ConsumerTest { public static void main(String[] args) { Consumer<Integer> c = s -> { System.原创 2022-03-04 09:41:21 · 2392 阅读 · 0 评论 -
JDK11的新特性之-新的HTTP API
使用HTTP Client请求的基本流程通常我们要在代码中做一个HTTP请求,通常有三个步骤。构建一个HTTP client。 生成一个HTTP Request。 使用HTTP Client发送HTTP Request得到一个HTTP Response。下面开始给出示例1.发出GET的同步请求import java.io.IOException;import java.net.URI;import java.net.http.HttpClient;import java.net原创 2021-11-04 16:24:09 · 4231 阅读 · 0 评论 -
java swing 加载自定义的字体
首先我们定义一个自定义加载子类的工具类:import java.awt.Font;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;import java.util.Pro原创 2021-02-01 15:06:13 · 3275 阅读 · 6 评论 -
JAVA8 的StringJoiner 使用以及原理解析
前几天偶然看到jdk1.8突然新增了一个类StringJoiner , 就研究了一下是怎么使用的, 以及看了下它的源码.使用如下:public static void main(String[] args) { //间隔符是, StringJoiner joiner1 = new StringJoiner(","); joiner1.add("1").add("2").add("3"); System.out.println(joi原创 2021-01-04 09:34:28 · 3089 阅读 · 8 评论 -
Java Xml转换成Json, 对象
现在有以下的xml文件, 内容如下:<iso_10303_28_terse xmlns="urn:oid:1.0.10303.238.1.0.1" xmlns:exp="urn:oid:1.0.10303.28.2.1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schema="integrated_cnc_schema"> <exp:header>原创 2020-12-01 14:09:06 · 1646 阅读 · 0 评论 -
使用spoon对java代码进行转换
现在我们的需求是对java代码进行转换:转换前的方法是: public XYDataItem addOrUpdate(Number x, Number y) { if (x == null) { throw new IllegalArgumentException("Null 'x' argument."); } XYDataItem overwritten = null; int index = ind原创 2020-12-01 14:06:39 · 2263 阅读 · 0 评论 -
查找文件夹下所有文本是否包含了特定的字符串
依赖于apache的lang3和google的guava的包import com.google.common.collect.Lists;import org.apache.commons.lang3.StringUtils;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputSt.原创 2020-11-02 14:07:46 · 1765 阅读 · 1 评论 -
maven项目本地window重新编译打包并启动jar包.cmd
重新编辑启动jar包.cmd::注意此脚本放在pom的同级目录下@echo offcall mvn clean package -U -Dmaven.test.skip=true::jar所在目录cd D:\idea\vspmanager-case-edit\target::jar包名字server.port=${port:8083}java -jar vspmanager-case-edit-0.0.1-SNAPSHOT.jar --server.port=9083echo ..原创 2020-10-09 16:43:27 · 1161 阅读 · 0 评论 -
Java8 的 Comparator 用法
java1.8 的新的函数式的Comparator 不要太方便了. 可以轻松的实现各种List 的排序, 比以前写什么匿名的内部类, 静态类方便了很多, 很多.//比较器//按照sort_id 的升序排//写法1Comparator<ApplyedPersonVO> c = (a, b) -> a.getSort_id().compareTo(b.getSort_id());//写法2Comparator<ApplyedPersonVO> c2=Comp..原创 2020-06-01 10:53:06 · 1988 阅读 · 0 评论 -
jdk1.8反编译工具 -Procyon-Decompiler
本来是使用的jad 挺好用的, 但是奈何不支持jdk1.8 , 所以只能更换了工具的下载网站是:https://bitbucket.org/mstrobel/procyon/downloads/国内的环境下载不下来, 最后我费了很多事才下载下来, 所以我放在网盘了,我直接下载了最新版的, procyon-decompiler-0.5.36.jar链接:https://pan.baidu.com/s/19KL3bFpYVbsEEtsB2hTJgw提取码:t8e7如果你只是反...原创 2020-05-21 15:37:10 · 11504 阅读 · 6 评论 -
Java的Long类型值传递到前端精度丢失问题
JavaScript 无法处理 Java 的长整型 Long 导致精度丢失,具体表现为主键最后两位永远为 0,解决思路: Long 转为 String 返回https://www.jianshu.com/p/fbcdcfc7cd12LambdaQueryWrapper<AuthorityEntity> lambda = new QueryWrapper<Autho...原创 2020-04-11 17:08:51 · 5783 阅读 · 2 评论 -
javassist使用解析
当时接到一个活, 需要做程序的评测, 前端传递java代码到后端, 后端进行java代码的评测. 包括代码是否能够编译运行, 结果时候正确, 运行的时间, 以及运行占用的内存的记录.这个时候我们就需要使用到java的动态编译了. 其实首先想到的就是JavaCompiler 这个类了, 可以自己实现一套代码的编译逻辑,国人, 廖雪峰 他最JavaCompile对了一个简单的封装, 打成了j...原创 2020-07-01 11:45:52 · 853 阅读 · 0 评论
分享