自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(807)
  • 收藏
  • 关注

原创 JUC并发—volatile和synchronized原理(二)

如果synchronized一个静态方法,就是对这个类的Class对象加锁。如果synchronized(类.class),也是对这个类的Class对象加锁。同一时间只有一个线程可以访问同一个类的synchronized方法。注意:每个类都会对应一个Class对象。i < 10000;i++) {//最后的结果未必是20000//synchronized一个类的静态方法,等价于synchronized(该类.class)一.偏向锁的介绍。

2025-06-06 17:44:53 624

原创 JUC并发—volatile和synchronized原理

一.高速缓存可解决CPU与内存的速度矛盾为了解决CPU与内存速度之间的矛盾,引入了高速缓存作为内存与CPU之间的缓冲。这里的高速缓存其实就是三级缓存。每个CPU可能有多个物理核,每个物理核会有多个逻辑核。每个CPU都有自己的三级缓存,每个物理核都有自己的一二级缓存。二.每个CPU都有自己的高速缓存每个CPU都有自己的高速缓存,而它们又共享同一个主内存。当多个CPU的运算任务都涉及到同一块主内存区域时,将可能导致各自的高速缓存的数据不一致。

2025-06-06 16:45:45 516

原创 Web前端入门:JavaScript 循环结构注意事项

如果说算法是程序的灵魂,那么循环可以算是算法的基石,很多常见的算法都需要使用循环实现,比如各种数组排序算法、查找算法、最短路径算法等等。循环是程序中的必修课,任何编程语言都有它的身影。前端路引Web前端入门第 62 问:JavaScript 循环结构注意事项 - 前端路引 - 博客园JNPF快速开发平台。

2025-06-05 17:38:36 1062

原创 一种更简单的方式运行 C# 代码,简化 C# 开发体验!

前段时间 .NET 10 Preview 4 推出了一种更简单的方式运行 C# 代码,即可以直接使用命令运行 C# 文件。这意味着我们不再需要创建项目文件或搭建整个应用程序框架,就能够快速运行脚本、测试代码片段或验证想法。

2025-06-05 15:24:31 271

原创 Web前端入门:JavaScript 各种对象定义与对象取值方法

JS 的对象定义可比 数组 的花样多多了,下面来一一展示。除了使用 JS 提供的内置构造函数,还可以自定义构造函数来创建一个对象。this.name = '前端路引';function关键字可不止用于函数定义,还能用来自定义构造函数,这是在 ES6 出现之前自定义类最常用的方式。以上已包含绝大多数应用场景,但是也会有一些不太常用的写法未包含,比如。作为入门条件,掌握以上内容已经完全够用。前端路引Web前端入门第 61 问:JavaScript 各种对象定义与对象取值方法 - 前端路引 - 博客园。

2025-06-03 17:17:11 814

原创 Redis主从复制详解

Redis 的主从复制(Master-Slave Replication)是实现数据备份、读写分离和水平扩展的核心机制之一。通过主从复制,一个主节点(Master)可以将数据同步到多个从节点(Slave),从节点还可以级联创建自己的从节点,从而形成树状结构。注意,Redis的主从复制是实现高可用的核心机制,并不能实现高可用。

2025-06-03 15:15:50 644

原创 RocketMQ实战—基于RocketMQ升级订单系统架构

当各个系统都落地该方案并且部署上线后,订单系统就会如下图所示。每次支付成功后仅仅更新自己的订单状态,同步扣减库存,接着就会发送消息到RocketMQ里去。然后推送系统、营销系统、积分系统、仓储系统就会从RocketMQ里获取订单支付成功的消息,执行对应的业务逻辑。通过上述改造,可以将订单核心流程的性能从1秒~几秒的情况优化到100ms+,大幅度提升性能。//这个是RocketMQ的生产者类,用这个就可以发送消息到RocketMQstatic {//这里就是构建一个Producer实例对象。

2025-05-30 17:29:25 1098

原创 Netty实战入门教程

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位以下的框架都使用了 Netty,因为它们有网络通信需求!Cassandra - nosql 数据库Spark - 大数据分布式计算框架Hadoop - 大数据分布式存储框架RocketMQ - ali 开源的消息队列ElasticSearch - 搜索引擎gRPC - rpc 框架。

2025-05-30 16:05:28 1027

原创 AI对低代码技术的影响

相比于低代码提供的模型驱动能力,AI技术进一步扩大了“自动生成”的应用范围,其优势在于将强大的上下文理解能力和知识整合能力,应用于成熟的编码开发,使用者几乎无需额外的学习成本,也不用承担引入新技术带来的技术风险。在过去几十年中,传统的企业软件依赖固定的菜单、按钮和表单,人们需要提供精准的指令才能获得预期的效果。随着这种融合的深入,我们可以预见,未来的企业应用开发将逐渐从"编写代码"转变为"描述需求",从"拖拽组件"转变为"对话设计",进一步释放开发者的创新潜能,为企业数字化转型提供强大动力。

2025-05-29 17:55:13 737

原创 Web前端入门:JavaScript 各种数组定义与数组取值方法

JS 的数组花样很多,不像其他强类型语言中的数组限制颇多。除了使用字面量[]定义数组外,还可以使用构造函数Array定义数组,也可以使用数组提供的内置方法定义数组。// 字面量定义数组// 空数组// 包含元素const arr5 = Array(1, 2, 3) // 与 new Array 一样,获取 [1, 2, 3]const arr6 = new Array(5) // [空属性 × 5] 数组长度为 5。

2025-05-29 15:54:51 292

原创 Disruptor—核心源码实现分析(三)

生产者投递Event时会使用"long sequence = ringBuffer.next()"获取序号,而序号栅栏SequenceBarrier和会序号Sequence搭配起来一起使用,用来协调和管理消费者和生产者的工作节奏,避免锁的使用。多生产者时,每个生产者线程都只会写各自获取到的Sequence序号对应的环形数组的元素,从而使得多个生产者线程相互之间不会产生写冲突。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会对这个缓存行形成竞争,从而无意中影响彼此性能,这就是伪共享。

2025-05-27 17:50:06 920

原创 Disruptor—核心源码实现分析(二)

Disruptor的消费者主要由BatchEventProcessor类和WorkProcessor类来实现,并通过Disruptor的handleEventsWith()方法或者handleEventsWithWorkerPool()方法和start()方法来启动。执行Disruptor的start()方法启动Disruptor实例时,便会通过线程池执行BatchEventProcessor里的run()方法,或者通过线程池执行WorkProcessor里的run()方法。

2025-05-27 16:00:46 455

原创 Disruptor—核心源码实现分析

该方法首先会调用Sequencer接口的tryNext()方法获取sequence序号,然后根据该sequence序号从RingBuffer的环形数组中获取对应的元素,接着再调用RingBuffer的translateAndPublish()方法将事件消息赋值替换到该元素中,最后调用Sequencer接口的publish()方法设置当前生产者的sequence序号来完成事件消息的发布。单生产者的线程执行上面的main()方法时,会创建一个单生产者Sequencer实例来代表生产者。

2025-05-26 18:00:09 363

原创 Disruptor—并发编程相关简介

一.AQS维护了一个state和一个线程等待队列其中volatile int state代表着共享资源,多线程争用资源被阻塞时会进入一个FIFO线程等待队列。二.AQS定义了独占和共享两种资源处理方式比如ReentrantLock使用的是Exclusive独占的方式,Semaphore使用的是Share共享的方式。三.AQS的核心方法isHeldExclusively()方法:判断线程是否正在独占资源。tryAcquire()和tryRelease()方法:表示以独占的方式尝试获取和释放资源。

2025-05-26 16:01:26 847

原创 Redis配置文件详解

Redis 配置文件的官网地址:https://redis.io/topics/configGitHub地址:https://github.com/redis/redis/blob/unstable/redis.conf本文主要是根据Redis6.0.x版本的配置文件讲解,其它版本的也可以当做一个参考。

2025-05-23 17:47:45 653

原创 【多线程】Java多线程与并发编程全解析

Java多线程与并发编程是一个复杂但强大的领域,掌握这些核心概念和工具能够帮助你编写高效、安全且易于维护的多线程应用程序。关键要点回顾:线程的生命周期和基本操作线程安全与同步机制(synchronized、ReentrantLock、原子类)JUC包中的并发工具类(Executor框架、CountDownLatch、CyclicBarrier等)线程池的原理和最佳实践并发集合类(ConcurrentHashMap、CopyOnWriteArrayList等)

2025-05-23 16:54:14 870

原创 反转链表(花式反转)

最好的方式还是双指针解法;如果数据量较大,递归解法和借用栈的方式都有可能导致栈溢出的情况程序员Seven反转链表(花式反转) - 程序员Seven - 博客园JNPF快速开发平台。

2025-05-22 16:25:08 966

原创 深入解析 Spring AI 系列:解析请求参数处理

总的来说,Spring AI项目通过对请求参数的自适应兼容处理,简化了与第三方接口的交互过程。通过对参数构造和数据处理的精细化管理,确保了无论是在功能调用,还是在API对接中,都能稳定、高效地工作。在我们深入分析了toPrompt()和方法的实现后,可以看到,它们通过抽象和封装有效地处理了复杂的接口请求,确保了用户的输入和系统的响应能够高效流畅地匹配。对于开发者而言,理解这些核心方法和自适应处理逻辑,不仅能提升开发效率,也能在对接第三方模型时更加得心应手。

2025-05-20 17:42:48 1083

原创 AI模型的回调能力的理解和实现

不知道有多少人会看到这里。操控AI模型其实没什么难度,最大的难度还是在“提示词的调试”,你需要不停的试错,不停地和模型的理解能力和幻觉做斗争。模型参数量越小,这个调试的难度就越大,因为小模型本来就很笨。这次调试多亏了Grok,否则要拿捏住0.6B的小模型不被它蠢哭,还真不容易。至于Big Tall是怎么跟Grok对话最终降伏小模型的?不告诉你!提示词才是AI时代最大的秘密!老翅寒暑AI模型的回调能力的理解和实现 - 老翅寒暑 - 博客园JNPF快速开发平台。

2025-05-20 16:07:02 661

原创 Web前端入门:JavaScript 3 种书写位置及 script 标签的正确存放位置

JS 代码应该首先考虑放在外部文件中,HTML 结构应该永远保持简洁。除非您真的有需求,才建议将 JS 代码放在 head 中,否则 JS 代码应该永远放在</body>结束标签之前。前端路引Web前端入门第 54 问:JavaScript 3 种书写位置及 script 标签的正确存放位置 - 前端路引 - 博客园JNPF快速开发平台。

2025-05-19 17:56:44 841

原创 SpringBoot3 使用 SolonMCP 开发 MCP

SolonMCP(全称:solon-ai-mcp)是 solon ai 的一个扩展。支持内嵌到 jfinal,vert.x,springboot2,springboot3 等框架使用。

2025-05-19 16:09:49 261

原创 校验参数的6大神功!

有时候,Hibernate Validator框架或者其他校验框架定义的校验不满足需求,我们需要自定义校验规则。则可以自定义注解,实现ConstraintValidator接口,来实现具体的自定义的校验逻辑。自定义注解@Contact在字段上使用。String message() default "联系方式格式错误";Class<?Class<?// 校验逻辑实现(不要相信前端的下拉框!@Override六边形战士培养计划可通过动态修改错误信息。

2025-05-16 17:42:57 1104

原创 卷积和池化到底在做什么?

如果深度学习和卷积的结合出现了,我们可以初始化一个3x3x3x64的算子,这里的64就是设计的特征空间,我们希望模型可以能设计出很多种不同的信息求解算子,这里的算子内部是完全随机初始化的,通过深度学习的反向传播,自己去求解,模型自己去寻找最适合他的算子组合,这就是卷积神经网络。很简单,我们只需要对图像矩阵套用这样一个矩阵进行点乘,X方向的特征会经过一正一反的求和而消失,Y方向的则正常保存,再经过取绝对值后,就完整的保留的Y方向的边界信息,同样的,我们想要保留X方向的只需要这样做。

2025-05-16 15:32:09 791

原创 AI技术发展简史:从图灵机到ChatGPT

人工智能(Artificial Intelligence,AI)自诞生以来,一直是计算机科学和软件工程领域的重要研究方向。随着计算能力的提升、算法的演进以及数据规模的增长,AI技术在多个行业迅速落地,从早期的专家系统到今天的深度学习和大模型,AI的应用边界不断扩展,影响着软件开发、数据治理和数字化管理等多个领域。从本质上讲,AI的目标是让机器具备模拟人类智能的能力,包括学习、推理、规划和创造等。

2025-05-15 17:33:12 635

原创 Java持久层技术演进:从JDBC到MyBatis-Plus

Data@Version通过本文的系统性讲解,我们从最基础的JDBC开始,逐步深入到MyBatis和MyBatis-Plus的核心实现原理。理解这些技术的演进过程和底层机制,有助于我们在实际项目中做出合理的技术选型,并根据业务需求进行适当的定制和优化。无论选择哪种技术,都要在开发效率、维护成本和系统性能之间找到平衡点。佛祖让我来巡山【Java持久层技术演进全解析】从JDBC到MyBatis再到MyBatis-Plus - 佛祖让我来巡山 - 博客园JNPF快速开发平台。

2025-05-15 16:25:26 1069

原创 RabbitMQ高级使用

在支付场景中,支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数据出现了不一致。此时前端发送请求查询支付状态时,肯定是查询交易服务状态,会发现业务订单未支付,而用户自己知道已经支付成功,这就导致用户体验不一致。因此,这里必须尽可能确保MQ消息的可靠性,即:消息应该至少被消费者处理1次该如何确保MQ消息的可靠性?如果真的发送失败,有没有其它的兜底方案?

2025-05-13 17:38:00 858

原创 C#多线程编程精要:从用户线程到线程池的效能进化论

用户线程,也称为前台线程(Foreground Threads),是由应用程序显式创建和管理的线程。这类线程通常用于执行需要长时间运行或与用户交互的任务。用户线程的生命周期完全由应用程序控制,只有当线程完成其任务或被显式终止时才会结束。守护线程,也称为后台线程(Background Threads),是一种在后台运行的线程,通常用于执行辅助性或支持性的任务。守护线程的生命周期与应用程序中所有用户线程的存活状态密切相关:当所有用户线程终止时,守护线程会自动被CLR终止,无论其任务是否完成。

2025-05-13 16:06:28 910

原创 Python 3.14 新特性盘点,更新了些什么?

这个带着圆周率数字的 Python 3.14 版本,给我们带来了全方位的升级。在性能上,类型提示的惰性求值和全新的尾调用解释器大幅减轻了启动负担,而实验性的 JIT 编译器则在特定场景下展现了可观的速度提升。在开发体验上,无侵入调试接口的加入和 REPL 的语法高亮功能使日常编程变得更加舒心逸意。模板字符串和 Zstandard 压缩的加入则扩展了 Python 在 Web 开发和数据处理领域的应用空间。

2025-05-12 17:44:38 1161

原创 Java 原生异步编程与Spring 异步编程 详解

Java异步编程是现代高性能应用开发的核心技术之一,它允许程序在执行耗时操作(如网络请求、文件IO)时不必阻塞主线程,从而提高系统吞吐量和响应性。// 核心线程数// 最大线程数// 队列容量// 空闲线程存活时间// 指定线程池return "线程池中的任务";}, pool);├─ 创建任务│ ├─ runAsync() -> 无返回值│ └─ supplyAsync() -> 有返回值├─ 处理结果│ ├─ thenApply() -> 转换。

2025-05-12 15:58:40 641

原创 历数Java虚拟机GC的种种缺点

Java通过垃圾收集器(Garbage Collection,简称GC)实现自动内存管理,这样可有效减轻Java应用开发人员的负担,也避免了更多内存泄露的风险。如果你用过C++等需要手动管理内存的语言,那么你就会体会到GC带来的便利,降低了语言使用的门槛。不过在我们享受自动内存管理带来的便利时,也不得不关注它带来的一些缺点。Java的垃圾收集器最被人诟病的可能就是STW了,不过除此之外,它还有一些缺点,这一篇我们就列举一下GC的几大缺点。在垃圾收集时,垃圾收集周期要求所有的应用程序线程停顿,这样是为了避免在

2025-05-09 17:49:16 935

原创 排行榜的5种实现方案!

数据规模:数据量大小直接决定了我们选择哪种方案实时性要求:是否需要秒级更新,还是分钟级甚至小时级都可以接受并发量:系统的预期访问量是多少开发资源:团队是否有足够的技术能力维护复杂方案业务需求:排行榜的计算逻辑是否复杂对于大多数中小型应用,方案二(缓存+定时任务)或方案三(Redis有序集合)已经足够。如果业务增长迅速,可以逐步演进到方案四(分片+Redis集群)。而对于社交平台等需要实时更新的场景,则需要考虑方案五(预计算+分层缓存)或方案六(实时计算+流处理),但要做好技术储备和架构设计。

2025-05-09 15:34:52 850

原创 Nacos源码—Nacos集群高可用分析(四)

Nacos实现的Raft协议主要包括三部分内容:一.Nacos集群如何使用Raft协议写入数据二.Nacos集群如何选举Leader节点三.Nacos集群如何让Leader实现心跳请求同步数据Nacos早期版本实现的只是Raft协议的简化版本,并没有两阶段提交的处理。而是Leader节点处理数据完成后,直接就去同步给其他集群节点。哪怕集群节点同步失败或没有过半节点成功,Leader的数据也不会回滚而只抛出异常。所以,Nacos早期版本的Raft实现,后期也会废弃使用。

2025-05-08 17:53:54 1007

原创 Nacos源码—Nacos集群高可用分析(三)

分区指的是网络分区。如果在分布式架构中,出现了网络通信问题。比如节点A可以和节点B相互通信,但是不能和节点C、D进行通信。但是节点C、D之间是可以通信的,这种情况下就是出现了网络分区。容错是指在分布式架构中,集群节点出现分区情况时,整个系统仍然要保持对外提供服务的能力,不能因为网络分区而导致整个系统不能对外提供服务。在CAP原则下:由于P是首要保证的,所以C、A就不能兼得,必须要舍弃其一。因此需要根据业务来权衡,是更注重可用性、还是更加注重一致性。一.Follower追随者。

2025-05-08 16:30:13 1102

原创 Nacos源码—Nacos集群高可用分析(二)

在集群管理模块下,可以看到每个节点的状态和元数据。节点IP就是节点的IP地址以及端口,节点状态就是标识当前节点是否可用,节点元数据就是相关的Raft信息。// 最后刷新时间// raft 元信息// leader IP 地址// raft 分组节点],"term": 1},// raft 端口// Nacos 版本在Nacos集群架构下,集群节点间的健康状态如何进行同步。简单来说,集群节点间是会相互进行通信的。如果通信失败,那么就会把通信节点的状态属性修改为DOWN。

2025-05-07 17:44:44 633

原创 Nacos源码—Nacos集群高可用分析

在单机模式下,Nacos服务端会开启一个对服务进行心跳健康检查的定时任务。那么在集群模式下,是否有必要让全部节点都执行这个定时任务?当Service的init()方法执行心跳健康检查任务时,首先会有一个逻辑判断。具体就是根据服务名称进行哈希运算,然后结合集群节点数量进行取模,最终选出一个节点来执行心跳健康检查任务。所以Nacos服务端对服务Service的心跳健康检查任务,在集群架构下,并不是每一台集群机器都会执行这个任务的,而是通过算法选出一台机器来执行,然后再把结果同步给其他集群节点。

2025-05-06 16:29:40 688

原创 掌握设计模式--策略模式

策略设计模式定义了一系列算法(策略),将每个算法封装到独立的策略类中,并通过上下文类动态地选择和使用不同的策略,从而让算法的变化独立于使用算法的客户端。渊渟岳from=001YH。

2025-04-30 17:40:03 803

原创 深入解析 Spring AI 系列:解析函数调用

通过今天的讨论,我们首先了解了如何实现函数调用的基础机制,通过核心代码示例展示了如何在Spring AI中进行函数的动态调用。在此过程中,关键的isToolCall方法和函数自动调用开关的使用,确保了我们可以根据具体需求调整函数调用的方式,甚至完全由客户端来接管函数执行。此外,通过维护聊天记录并精心管理工具调用的顺序,我们能确保AI的行为更为可控和稳定。

2025-04-29 15:54:30 635

原创 用远程代理模式轻松实现远程服务调用,打开编程新大门

通过这种实现,您可以模拟一个基于Socket的远程服务和远程代理的应用。客户端通过与远程服务进行通信,而远程服务通过提供计算功能。客户端在使用代理对象进行操作时,就像是调用本地的方法一样,无感的实现远程方法的调用。这种调用方式又称为远程过程调用。常用的远程过程调用框架有CXF、Dubbo、gRPC等等,其核心思想之一都是远程代理,它实现了在本地调用远程服务时的透明性,使得远程调用看起来像本地调用。渊渟岳用远程代理模式轻松实现远程服务调用,打开编程新大门 - 渊渟岳 - 博客园。

2025-04-28 18:14:36 840

原创 K8s新手系列之K8s中的资源

kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。Service:为 Pod 提供稳定的网络端点(负载均衡)。

2025-04-28 15:58:24 1186

原创 G1原理—G1垃圾回收过程之Mixed GC

Mixed GC混合回收是什么:一.YGC的过程二.Mixed GC有那些步骤三.YGC和Mixed GC的关系四.Mixed GC的并发标记是从那些对象开始的五.Mixed GC的标记还需要做哪些内容问题:Mixed GC(混合回收)的标记还需要做哪些工作?由于需要从老年代中选择一些性价比较高的区域来回收,所以需要进行性价比相关的标记。那么性价比又应该怎么计算?在MGC的并发标记阶段中会使用位图,那么位图在并发标记阶段又应该怎么使用?为什么YGC可作为Mixed GC的初始标记阶段?

2025-04-23 17:35:07 791

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除