- 博客(84)
- 资源 (4)
- 问答 (2)
- 收藏
- 关注
原创 Java并发编程:读写锁与普通互斥锁的深度对比
本文对比了Java中的普通互斥锁(synchronized/ReentrantLock)和读写锁(ReentrantReadWriteLock)。普通锁适用于读写均衡或写多场景,提供简单互斥;读写锁在读多写少时性能更优,允许多线程并发读。通过测试数据表明,读多场景下读写锁吞吐量可提升246%。文章还分析了锁的粒度、适用场景、饥饿问题,并给出锁降级/升级的实践建议。最后总结不同场景下的锁选择策略:读写锁适合缓存系统,普通锁适合计数器,强一致性系统推荐互斥锁。建议结合JMH测试和监控工具选择最优方案。
2025-06-03 23:59:22
916
转载 时间复杂度和空间复杂度的概念
算法性能评估涉及时间复杂度和空间复杂度两个关键指标。时间复杂度反映算法的执行时间,采用大O记法表示,如O(n)、O(n²),其估算方法是统计执行次数后去除低阶项和系数。空间复杂度衡量算法内存占用情况,同样用大O表示法。实际应用中需根据场景权衡这两个指标:大数据处理时优先考虑时间复杂度,内存受限时则更关注空间复杂度。通过预先分析算法步骤进行估值,可以高效选择最优算法方案。常见复杂度排序为:O(1)<O(logn)<O(n)<O(n²)<O(2ⁿ)。
2025-06-03 16:14:43
9
原创 为什么 Docker 建议关闭 Swap
项目是否推荐关闭 SwapDocker 生产环境推荐关闭测试环境/内存充足可保持启用(用于调试或开发)Kubernetes 集群节点推荐关闭(尤其在 v1.22 之前)
2025-05-17 17:58:40
876
原创 `ParameterizedType` 和 `TypeVariable` 的区别
特性表示类型已经被参数化的类型泛型类型变量(未指定具体类型)常见形式Map<K, V>TEK是否有实际类型参数✅ 有 (❌ 没有是否代表泛型变量❌✅使用场景获取具体泛型类型信息获取泛型变量本身信息是否能直接用于创建对象❌(运行时被擦除)❌(只是一个变量)
2025-05-16 21:40:29
737
原创 Java 泛型与类型擦除:为什么解析对象时能保留泛型信息?
Java 泛型是编译时特性。在编译后会变为原始类型List。泛型类型参数(如String)仅在编译阶段进行类型检查。场景是否保留泛型原因直接访问List变量的泛型❌ 否类型擦除后运行时无信息解析完整对象(如Event✅ 是类字段的泛型信息保存在元数据中,可通过反射获取使用✅ 是匿名内部类的泛型参数通过父类类型保留Java 的类型擦除机制虽然带来了限制,但通过类结构的元数据和框架的智能处理,我们仍然能在关键场景下“找回”泛型信息。
2025-05-16 21:38:21
968
原创 Docker Compose 的历史和发展
这张图表展示了Docker Compose从V1到V2的演变过程,并解释了不同版本的Compose文件格式及其支持情况。
2025-05-11 20:28:07
494
原创 MyBatis 核心类详解与架构解析:从入门到源码级理解
类名职责简述构建创建SqlSession提供数据库操作 APIExecutorSQL 执行引擎单条 SQL 的封装全局配置管理器JDBC Statement 操作设置 SQL 参数Java 与 JDBC 类型转换结果集处理。
2025-05-04 09:50:10
794
原创 @Validated与@Valid的正确使用姿势
场景是否生效原因基本类型 + 类级别@Validated✅类级别启用校验,参数约束生效。基本类型 + 参数级别@Valid/@Validated❌缺少类级别支持,无法触发校验。对象类型 + 参数级别@Valid/@Validated✅Spring MVC自动处理对象参数校验。对象类型 + 无参数注解❌需要显式标记@Valid或@Validated以触发校验。
2025-04-19 16:09:19
353
原创 JSON 中的反斜杠 `\`
通过上述示例代码和解析,我们可以清楚地看到 JSON 中反斜杠的使用和处理方式。在 JSON 字符串中,反斜杠用于转义特殊字符,确保 JSON 数据的正确解析和表示。在 Java 中,反斜杠也需要使用两个反斜杠进行转义。正确处理这些转义字符对于开发人员来说非常重要,尤其是在处理复杂的 JSON 数据时。
2025-04-03 14:00:38
551
原创 深入解析 JDK 动态代理
JDK 动态代理是 Java 内置的一种代理机制,它允许我们在运行时动态创建一个代理对象。这个代理对象可以拦截对目标对象方法的调用,并在方法调用前后插入额外的逻辑。动态代理的核心是通过类和接口来实现。动态性:代理类的字节码在运行时生成,不需要提前编写代理类的代码。基于接口:只能代理实现了接口的类。灵活性:可以在运行时动态插入额外逻辑,无需修改目标类的代码。首先,我们定义一个login和logout。
2025-04-03 10:36:33
728
原创 优化线程池关闭机制以避免无限循环
方法并设置合理的超时时间,可以有效地避免线程池关闭过程中的无限循环和资源浪费。同时,捕获和处理中断异常可以提高程序的健壮性。希望本文的建议能帮助你在实际开发中更好地管理线程池,确保程序的稳定运行。在多线程编程中,正确关闭线程池是一个重要的任务,以确保程序的稳定性和资源的有效利用。本文将探讨一种常见的线程池关闭机制,并提出优化建议,以避免无限循环和资源浪费。这段代码的目的是等待线程池中的所有任务完成,然后关闭线程池。方法来等待线程池关闭,并设置合理的超时时间。调用 shutdown。
2025-02-13 20:00:00
873
原创 域名的分层结构
域名的分层结构是指域名系统中域名的组织方式,它由不同级别的标签(labels)组成,这些标签通过点(.)分隔。域名的这种分层结构使得域名系统既灵活又可扩展,能够适应不同用户的需求,同时也便于管理和导航。一个完整的域名可以包含多个层级,每个层级都可以进一步细分。
2024-11-14 15:45:17
614
转载 SSE:服务器发送事件
服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE)。本文介绍它的用法。
2024-10-29 17:47:33
203
原创 通用软件版本标识
在软件开发和发布过程中,版本号和标识扮演着重要的角色。它们不仅帮助开发者追踪软件的演变,还让用户了解软件的稳定性和功能。以下是一些常见的软件版本标识,以及它们的含义和用途。
2024-10-21 23:53:57
528
原创 处理Hutool的Http工具上传大文件报OOM
实际上就是把文件全部都加载到了Byte数组中,如果上传的文件过大必定会导致OOM。这里自己写一个服务端的接口看看StreamingMode的header有什么区别。先来测试一下 setChunkedStreamingMode 的效果。header, 来告诉服务端当前请求主体内容的字节数。Hutool 的 HttpRequest中只提供了。方式其实感觉上会更好,不会出现服务端不支持的情况,从异常堆栈信息中可以看出这里使用了。这是修改前会出现OOM的客户端代码。
2024-10-21 11:26:44
1621
转载 kubernetes安装详解
3.关闭防火墙4.修改主机名5.添加hosts解析6.设置k8s内核参数设置内核参数加载内核模块使内核参数生效7.关闭系统swap修改fstab文件,关闭swap的自动挂载。9.安装依赖包10.时间同步11.安装docker-ce软件提示:master节点不需要安装删除自带的docker安装依赖包安装yum源安装docker-ce启动,并设置开机自启[安装设置好flanneld后,再启动docker]11.安装CFSSLcfssl三:创建CA证书
2024-08-15 09:35:05
669
转载 Spring Boot搭建AI原生应用
什么是「AI原生应用」?简单一句话就是,AI带来应用的最核心价值,如果脱离开 AI,应用将不存在。AI原生应用是指在设计、开发、部署、运营和维护过程中,具有内在安全、可信的AI能力应用,其中AI是功能的自然组成部分。实现一个AI原生应用的过程,往往需要利用数据驱动和基于知识的生态系统,在这一过程中,数据与知识将被消费和生产,以实现新的基于AI的原生功能。在需要时通过学习和自适应的AI增强能力,来替代以往静态的、基于规则的机制。
2024-07-31 16:13:55
255
原创 无缝前端部署
保留旧版本文件:利用 Vue 构建时生成的包含哈希值的静态文件名。分阶段上传:先压缩文件,再上传并解压。监控和自动化部署:使用和 Docker 实现实时监控和自动化部署。通过上述策略,我们可以实现 Vue 应用的无缝部署,减少部署过程中对用户的影响。这种方法不仅适用于 Vue,也可以扩展到其他前端框架和应用。
2024-05-18 22:34:00
525
原创 Dockerfile中的CMD和ENTRYPOINT
与Exec格式不同,使用Shell格式的指令总是使用命令shell。Shell格式不使用JSON数组格式,而是一个常规的字符串。在使用shell格式时系统会自动选择一个命令shell来执行指令,而在使用exec格式时,需要明确指定使用哪个命令shell或其他可执行文件来执行命令。exec格式使得避免使用shell字符串处理成为可能,并且可以使用特定的命令shell或任何其他可执行文件来调用命令。当使用Exec格式并直接执行shell时,就像Shell格式一样,是由shell进行环境变量替换,而不是构建器。
2024-05-05 23:31:21
3239
2
原创 Linux procps-ng - top
程序或窗口名称,取决于显示模式当前时间和自上次启动以来的时间长度用户总数系统负载(1 分钟、5 分钟、15 分钟内的平均进程数),对于单核CPU 1.0表示满负载摘要区交互命令在全屏模式和alternate-display模式下始终可用。它们影响显示的起始行,并确定消息和提示的位置。这些命令总是只影响“当前”窗口/字段组。C:显示滚动坐标切换切换一个信息消息,当消息行没有被使用时会显示。l:负载平均值/正常运行时间切换。
2023-11-19 00:31:14
1669
转载 跨域资源共享 CORS 详解
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
2023-10-11 23:16:04
204
原创 Linux网络监控工具 - iftop
iftop 是一个基于 libpcap 库的网络流量监控工具。它通过监听指定网络接口上的数据包,并分析这些数据包的源地址、目标地址、源端口、目标端口、协议等信息,从而实时显示网络流量的相关统计信息。
2023-10-09 23:33:17
3237
3
原创 Linux网络监控工具 - nethogs
nethogs是一个基于命令行的网络监控工具,用于实时监视每个进程的网络流量。它可以显示每个进程使用的带宽、连接数和数据包数量等信息。
2023-10-08 10:21:20
1940
原创 Duration.parse格式说明
Duration.parse是Java 8及以上版本中的一个方法,用于将字符串表示的时间段解析为Duration对象。时间单位(Time Units):使用大写字母表示时间单位,包括年(Y)、月(M)、周(W)、天(D)、小时(H)、分钟(M)和秒(S)。上述代码将字符串"PT2H30M"解析为一个Duration对象,并输出该对象的字符串表示和总分钟数。Duration对象表示的时间段最大单位为天(24小时),不能表示更长的时间段。字符串中的字母大小写敏感,必须使用大写的P、T和H/M/S。
2023-08-02 14:30:45
1419
1
转载 MySQL对于相同名称用户但host不同的登陆选择
有时候我们会发现有创建多个相同名称的用户,但是host给的不是相同的,最普遍的是有的小伙伴习惯性的创建 root 用户,系统有默认的 root@‘127.0.0.1’ ,而自己再去创建个 root@‘%’ 或 root@'192.168.20.%'类似这种的,那么存在多个相同名称的了,mysql在登录时候会选择哪个用户来进行登陆呢?记得有块官方文档介绍这一块的,一时没找到,感兴趣小伙伴自己去找下。大致意思应该如下:服务器使用与客户端主机名和用户名相匹配的第一行记录进行授权。
2023-04-03 14:42:58
964
转载 SpringSession
在开始spring-session揭秘之前,先做下热脑(活动活动脑子)运动。为什么要spring-session比较traditional-session方案和spring-session方案JSR340规范与spring-session的透明继承spring-session提供集群环境下HttpSession的透明集成。spring-session的优势在于开箱即用,具有较强的设计模式。
2022-11-06 23:28:56
6982
翻译 Jackson Annotation 示例
在本教程中,我们将深入研究 Jackson Annotations。我们将了解如何使用现有注解,如何创建自定义注解,最后如何禁用它们
2022-09-07 23:33:17
278
翻译 Jackson ObjectMapper 简介
本教程重点介绍如何理解 Jackson ObjectMapper 类,以及如何将 Java 对象序列化为 JSON,以及如何将 JSON 字符串反序列化为 Java 对象ObjectMapper类的另一个基本功能是注册自定义序列化程序和反序列化程序的能力。在输入或输出JSON响应在结构上与必须序列化或反序列化的Java类不同的情况下,自定义序列化程序和反序列化程序非常有用。super(t);...
2022-08-31 00:11:09
645
原创 Docker 部署 RabbitMQ 集群
为了保证线上环境RabbitMQ的高可用性,需要部署一套集群环境。RabbitMQ集群主要有两方面的优势:高可用、高性能;高可用就是保证其中部分RabbitMQ节点崩溃或停机的情况下应用程序不受影响,高性能就是对RabbitMQ的横向扩展,支持更大量的消息通信。
2022-08-21 01:13:13
2074
1
原创 数字精度问题
前端JS不支持Long类型数字,返回给前端Long类型数据时需要转换为Stringmongodb中默认数字类型也是浮点数类型,在查询数据时要注意属性类型
2022-08-17 00:06:16
442
Maven实战(许晓斌著)完整高清版PDF
2017-05-29
精通Spring 4.x 企业应用开发实战
2017-06-03
HttpClient4.x 教程 PDF
2017-06-25
疯狂Spring Cloud
2018-04-22
提交请求后台(javaweb tomcat)无法获取参数
2018-05-05
异步Servlet为什么能提高并发?
2018-10-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人