- 博客(102)
- 收藏
- 关注
原创 通俗易懂解释Java8 HashMap
Java 8 HashMap 原理解析 HashMap 是 Java 中基于哈希表的键值对集合,采用数组+链表+红黑树结构存储数据。核心原理如下: 存储结构 数组(桶)存储节点,每个位置可挂载链表或红黑树(冲突时)。 当链表长度>8且数组长度≥64时,链表转为红黑树以提升查询效率(O(n)→O(log n))。 哈希计算 通过扰动函数(hashCode ^ (hashCode >>> 16))混合高低位,减少哈希冲突。 数组下标计算:hash & (table.length
2025-08-02 22:25:21
1080
原创 Oracle11g数据库迁移达梦8数据库方案
SpringBoot项目从Oracle迁移至达梦数据库方案摘要 本文详细介绍了将SpringBoot项目从Oracle迁移至国产达梦数据库(DM)的完整方案。主要内容包括: 迁移准备工作 - 环境确认、工具准备(达梦客户端、数据迁移工具等) 迁移步骤 - 从Oracle数据备份、达梦初始化、表结构迁移、数据迁移到SpringBoot配置调整 兼容性处理 - 数据类型映射、SQL语法适配、存储过程调整等关键技术点 注意事项 - 字符集设置、NULL值处理、自增字段实现等细节问题 测试验证 - 数据一致性检查、
2025-07-30 21:52:47
1190
2
原创 通俗易懂的解释G1垃圾收集器
Java的G1垃圾收集器采用"垃圾优先"策略,将堆内存划分为多个Region区域。其工作流程分为四个阶段:初始标记(短暂STW)、并发标记(后台统计垃圾最多的Region)、最终标记(最终确认)和筛选回收(优先清理垃圾最多的Region)。G1的优势包括并发收集、区域化管理、可预测停顿时间和适合大内存场景,但存在老年代Full GC性能较差和管理复杂的缺点。G1通过智能选择垃圾最多的Region进行回收,同时进行内存整理,有效平衡了回收效率和内存碎片问题。
2025-07-30 21:30:07
317
原创 通俗理解CMS垃圾收集器
CMS垃圾回收器工作原理类比 CMS(Concurrent Mark Sweep)是一种以低延迟为目标的垃圾回收器,其工作过程可类比为高效清理房间: 初始标记(短暂暂停):快速标记正在使用的对象(如手边的物品)。 并发标记(不暂停):后台标记所有关联的存活对象,同时用户线程继续运行。 重新标记(短暂暂停):修正并发标记期间遗漏的新引用。 并发清除(不暂停):清理未标记的垃圾对象,避免碎片问题。 特点:减少停顿时间,适合响应敏感应用,但存在内存碎片和并发失败风险。 核心:像智能清洁工,边工作边打扫,但需短暂停
2025-07-30 09:29:37
408
原创 JUC中的LockSupport工具类的使用上篇
输出了上面2行之后,程序一直无法结束,t1线程调用wait()方法之后无法被唤醒了,从输出中可见, notify()方法在 wait()方法之前执行了,等待的线程无法被唤醒了。说明:唤醒方法在等待方法之前执行,线程无法被唤醒。t1线程中调用 lock.wait()方法让t1线程等待,主线程中休眠5秒之后,调用 lock.notify()方法唤醒了t1线程,输出的结果中,两行结果相差5秒左右,程序正常退出。唤醒方法需要在等待方法之后调用,线程才能够被唤醒。
2025-06-18 17:25:25
277
原创 大模型使用
本文介绍了大模型部署的两种主要方式(本地部署和云平台部署)及其优缺点比较。本地部署分为云服务器和本地机器两种形式,分别存在数据安全性和成本效益上的差异;云平台部署则无需自行维护但存在长期成本问题。详细讲解了使用Ollama工具在本地电脑上部署Qwen3模型的步骤,包括安装、运行和HTTP接口调用方法。同时介绍了阿里云百炼平台的大模型调用流程和API使用要点,重点解析了请求参数中model、messages、stream、enable_search的作用以及响应数据的结构。通过对比不同部署方式的特性,为用户选
2025-06-17 17:16:55
1076
原创 linux安装node版本管理工具NVM
以下路径/usr/local/nvm/nvm-0.39.3为nvm安装路径,编辑vim ~/.bashrc。nvm 的卸载也比较简单,直接删除相关文件和配置项即可。配置环境变量:在文件末尾加上以下配置。
2025-03-12 14:39:15
198
原创 OpenResty开发环境搭建
OpenResty® 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。官方地址:http://openresty.org/cn/具备Nginx的完整功能基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块允许使用Lua自定义业务逻辑、自定义库。
2024-12-24 10:10:10
535
原创 Consul安装和使用:服务注册与发现
Consul是一个开源的分布式服务发现和配置管理工具。它提供了一个分布式的、高可用的数据存储,可以用来存储键值对、配置数据、服务发现信息等。同时,Consul还提供了HTTP和DNS接口,可以用来查询服务、配置和健康状态等信息。service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。health checking:健康检测使consul可以快速的告警在集群中的操作。
2024-12-22 22:05:09
480
原创 JUC中的LockSupport工具类的使用下篇
LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程。主要是通过park()和unpark(thread)方法来实现阻塞和唤醒线程的操作的。每个线程都有一个许可(permit),permit只有两个值1和0,默认是0。当调用unpark(thread)方法,就会将thread线程的许可permit设置成1(注意多次调用unpark方法,不会累加,permit值还是1)。当调用park()方法,如果当前线程的permit是1,那么将permit设置为0,并立即返回。
2024-12-09 22:24:20
497
原创 JUC中的LockSupport工具类的使用上篇
输出了上面2行之后,程序一直无法结束,t1线程调用wait()方法之后无法被唤醒了,从输出中可见, notify()方法在 wait()方法之前执行了,等待的线程无法被唤醒了。说明:唤醒方法在等待方法之前执行,线程无法被唤醒。t1线程中调用 lock.wait()方法让t1线程等待,主线程中休眠5秒之后,调用 lock.notify()方法唤醒了t1线程,输出的结果中,两行结果相差5秒左右,程序正常退出。唤醒方法需要在等待方法之后调用,线程才能够被唤醒。
2024-12-09 22:23:34
472
原创 JUC中的Semaphore(信号量)
Semaphore(信号量)为多线程协作提供了更为强大的控制方法,前面的文章中我们学了synchronized和重入锁ReentrantLock,这2种锁一次都只能允许一个线程访问一个资源,而信号量可以控制有多少个线程可以访问特定的资源。
2024-12-05 08:28:26
1222
原创 JUC中的循环栅栏CyclicBarrier的6种使用场景
主管相当于 CountDownLatch,干活的小弟相当于做事情的线程。老板交给主管了一个任务,让主管搞完之后立即上报给老板。主管下面有10个小弟,接到任务之后将任务划分为10个小任务分给每个小弟去干,主管一直处于等待状态(主管会调用await()方法,此方法会阻塞当前线程),让每个小弟干完之后通知一下主管(调用countDown()方法通知主管,此方法会立即返回),主管等到所有的小弟都做完了,会被唤醒,从await()方法上苏醒,然后将结果反馈给老板。期间主管会等待,会等待所有小弟将结果汇报给自己。
2024-12-04 08:27:09
964
原创 JUC中等待多线程完成的工具类CountDownLatch,必备技能
CountDownLatch称之为闭锁,它可以使一个或一批线程在闭锁上等待,等到其他线程执行完相应操作后,闭锁打开,这些等待的线程才可以继续执行。确切的说,闭锁在内部维护了一个倒计数器。通过该计数器的值来决定闭锁的状态,从而决定是否允许等待的线程继续执行。常用方法:public CountDownLatch(int count):构造方法,count表示计数器的值,不能小于0,否者会报异常。
2024-12-03 10:00:34
934
原创 同步和异步、并发和并行、阻塞和非阻塞的区别
实际上,如果系统内只有一个CPU,而使用多进程或者多线程任务,那么真实环境中这些任务不可能是真实并行的,毕竟一个CPU一次只能执行一条指令,在这种情况下多进程或者多线程就是并发的,而不是并行的(操作系统会不停地切换多任务)。这天你热的是在不行了,就催着商家赶紧给你送货,于是你就在商店里面候着他们,直到商家把你和空调一起送回家,一次愉快的购物就结束了。从严格意义上来说,并行的多任务是真的同时执行,而对于并发来说,这个过程只是交替的,一会执行任务A,一会执行任务B,系统会不停地在两者之间切换。
2024-12-03 09:59:27
328
原创 spring事务源码解析-前篇
事务启动的过程中需要定义事务的一些配置信息,如:事务传播行为、隔离级别、超时时间、是否是只读事务、事务名称,spring中使用TransactionDefinition接口表示事务定义信息,下面看一下TransactionDefinition接口源码,主要有5个信息事务传播行为事务隔离级别事务超时时间是否是只读事务事务名称//传播行为:REQUIRED//传播行为:SUPPORTS//传播行为:MANDATORY//传播行为:REQUIRES_NEW。
2024-11-26 08:24:02
626
原创 Spring中的@Import-注解探讨----批量注册bean
现在我们来引出关于@Import的问题,带着问题去讨论,效果更好首先我们讨论一下为什么要用@Import我们都知道,spring批量注册组件两种方式。
2024-11-19 10:48:46
887
原创 spring-@Configuration原理解析
环境版本:java8,spring5.2.x,maven3.6@Configuration注册类的全过程,话不多说,上代码,我这里是从关键的方法人手了说明:doRegisterBean方法很复杂,我们的主题是@Configuration,所以省略一些不重要的代码。将获取到的 scope 赋值给 BeanDefinition(这步完成后刚刚创建的 AnnotatedGenericBeanDefinition 对象的 scope 属性为 scope 值)。
2024-11-19 10:47:01
1181
1
原创 SpringBoot整合Liquibase对数据库管理和迁移
Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(rollback)到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。本文主要介绍SpringBoot与Liquibase的集成。
2024-11-07 15:32:29
1191
原创 Mybatis一级缓存,二级缓存探讨上篇
从输出中可以看出2次查询都访问了db,并且两次查询的结果是不一样的,两个集合也不相等,插入数据让缓存失效是可以理解的,插入操作可能会改变数据库中的数据,所以如果再从缓存中去获取,可能获取到的数据和db中的数据不一致的情况,mybatis为了避免这种情况,在执行插入操作的时候,会将SqlSession中的一级缓存清空。同一个SqlSession中查询同样的数据,mybatis默认会从一级缓存中获取,如果缓存中没有,才会访问db,那么我们如何去情况一级缓存呢,强制让查询去访问db呢?
2024-11-07 11:43:48
732
原创 Mybatis延迟加载、鉴别器、继承
4张表:t_user(用户表)t_goods(商品表)t_order(订单表)t_order_detail(订单明细表)表之间的关系:t_order和t_user是一对一的关系,一条订单关联一个用户记录t_order和t_order_detail是一对多关系,每个订单中可能包含多个子订单,每个子订单对应一个商品。
2024-11-07 11:41:25
998
原创 Mybatis入门篇,带你感受一下mybatis独特的魅力!
准备数据库mysql中运行下面脚本:我们的需求:对t_user表,我们有以下这些需求:实现一个通用的插入操作:支持动态插入,可以根据传入的字段的值,动态生成所需要的各种insert语句批量插入功能实现一个通用的更新操作:支持动态更新操作,可以根据传入的字段,动态生成所需要的各种update语句实现一个通用的查询操作:支持各种组合条件查询、支撑排序、分页、支持返回列的控制等各种复杂的查询需求引入mybatis依赖:子项目为:创建mybatis相关文件user.xmlchat01/src/mai
2024-11-05 14:20:42
419
原创 Mybatis类型处理器,这个你得会玩!
id int AUTO_INCREMENT PRIMARY KEY COMMENT '用户id',name VARCHAR(32) NOT NULL DEFAULT '' COMMENT '用户名',age SMALLINT NOT NULL DEFAULT 1 COMMENT '年龄',sex SMALLINT DEFAULT 0 COMMENT '性别,0:未知,1:男,2:女') COMMENT '用户表';
2024-11-05 14:19:25
599
原创 JVM调优(jdk8)与垃圾回收器详解
负载屏障的目标是在指针加载时插入一个处理逻辑。在压缩阶段,如果指针指向将要被移动的对象的区域,指针指向的对象将被移动,然后纠正指针。如果你要创建一个大于这个大小的对象,比如一个超大的数组,或者是别的啥东西,此时就直接把这个大对象放到老年代里去,压根不会经过年轻代,有一个JVM参数,就是“-XX:PretenureSizeThreshold”,可以把它的值设置为字节数,比如“1048576”字节,就是1MB。在这个阶段,ZGC会遍历堆中的所有活动对象,并将它们移动到新的位置,以便将未使用的内存空间紧凑起来。
2024-11-05 14:16:25
1120
原创 JVM出现OOM错误排查
对应线程出现的OOM错误,其实分好几类:堆内存溢出、栈溢出、方法区溢出,下面我们要区分两个概念内存泄漏是指GC垃圾回收的速度跟不上内存消耗的速度,造成OOM的情况内存溢出是指程序员在申请内存时,没有足够的内存空间供其用,OutOfMemoryError。
2024-10-31 08:54:53
617
1
原创 Forest入门和使用
ForestForest是一个开源的Java HTTP客户端框架,它能够将 HTTP 的所有请求信息(包括URL、Header以及Body等信息)绑定到您自定义的Interface方法上,能够通过调用本地接口方法的方式发送HTTP请求,类似于的openFeign框架。创建一个interface,比如命名为MyClient,并创建一个接口方法名为,用@Get注解修饰之。
2024-10-31 08:53:09
1082
原创 java设计模式之监听者模式
继承了 AbstractEvent 类/*** @description: 用户注册事件*/@Getter发送优惠券/*** @description: 注册成功后发优惠券*/@OverrideSystem.out.println(event.getUsername() + "注册成功,赠送优惠券。。。。。");发短信/*** @description: 注册成功后发短信*/@Override。
2024-10-30 16:36:42
1014
原创 Java内存模型和Java内存区域的区别和联系
Java作为—种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型这三者的概念及其间的区别。甚至我见过有些面试官自己也搞的不是太清楚。不信的话,你去网上搜索Java内存模型,还会有很多文章的内容其实介绍的是JVM内存结构。
2024-10-30 16:18:28
921
原创 三方接口调用设计方案
API密钥生成:为每个三方应用生成唯一的API密钥对(AK/SK),其中AK用于标识应用SK用于进行签名和加密。AK:Access Key Id,用于标示用户。SK:Secret Access Key,是用户用于加密认证字符串和用来验证认证字符串的密钥,其中SK必须保密。通过使用Access Key Id / Secret Access Key加密的方法来验证某个请求的发送者身份。接口鉴权:在进行接口调用时,客户端需要使用AK和请求参数生成签名,并将其放入请求头或参数中以进行身份验证。
2024-10-28 08:45:24
1331
原创 AQS-源码解析实现原理
AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器(所谓同步,是指线程之间的通信、协作)的框架,Lock 包中的各种锁(如常见的 ReentrantLock, ReadWriteLock), concurrent 包中的各种同步器(如 CountDownLatch, Semaphore, CyclicBarrier)都是基于 AQS 来构建,所以理解 AQS 的实现原理至关重要,AQS 也是面试中区分侯选人的常见考点,我们务必要掌握,本文将用循序渐近地介绍 AQS,相
2024-10-28 08:35:32
728
原创 MySql如何实现分布式锁
本篇我们使用mysql实现一个分布式锁。环境:mysql8,navicat,maven,springboot2.3.11,mybatis-plus。
2024-10-26 21:07:40
839
1
原创 数据库设计的六大范式
最近在看数据库设计伦理,顺便里来理清一下数据库设计的六大范式。首先我们来了解几个概念。例如,对于表3中的数据,找不到任何一条记录,它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号,写作 学号 → 姓名。但是反过来,因为可能出现同名的学生,所以有可能不同的两条学生记录,它们在姓名上的值相同,但对应的学号不同,所以我们不能说学号函数依赖于姓名。例如 学号 F→ 姓名,(学号,课名) F→ 分数例如 (学号,课名) P→ 姓名。
2024-10-26 21:05:17
693
原创 事务的原理、MVCC的原理
所谓的MVCC指的就是在使用READ COMMITED 和 REPEATABLE READ这两种隔离级别的事务在执行select操作时,访问记录版本链的过程,这样可以使不同事务的读-写操作并发执行,从而提升系统性能。事务完全的串行会严重的降低系统的吞吐量和资源利用率,仔细发现,引发事务一致性问题的根本原因在于多个事务访问了相同的数据,更合理的做法是,在某个事务访问某个数据时,对其他想要访问该数据的事务进行限制,当该事务提交后,其他事务才能继续访问这个数据。**两者的根本区别在于幻读关注的是。
2024-10-26 21:03:07
1376
原创 MySql用户相关操作,管理员的必备技能
通过命令的方式操作用户和权限不需要刷新,下次登录自动生效通过操作mysql库中表的方式修改、用户信息,需要调用flush privileges;刷新一下,下次登录自动生效mysql识别用户身份的方式是:用户名+主机本文中讲到的一些指令中带主机的,主机都可以省略,默认值为%,表示所有机器mysql中用户和权限的信息在库名为mysql的库中。
2024-10-24 10:49:17
1020
原创 MySQL索引原理及分析
联合索引页也是二级索引,他和普通索引类似,唯一的区别是目录页和数据页存储的key是联合索引的key,假设是为a,b两个字段做联合索引,则在构建索引的时候,会先按照a排序,如果a有相同的就按照b排序,这就是最左匹配原则的道理,因为b的排序是乱的,所以使用b不会走索引。目录页面的记录类型有个不一样,他的索引项的记录类型是1,而且索引项的内部结构是指向一个页面的指针,页面可以是数据页面,也可以是其他页面。为了避免索引失效,需要仔细设计数据库表结构,合理创建索引,并确保查询语句能够充分利用索引。
2024-10-24 10:47:01
995
原创 mysql培训笔记
内核参数调优 sysctl -a 打印系统参数,使用sysctl -w 设置值,也可以直接写入sysctl.conf文件,不过生效sysctl -p。innodb 修复 innodb_force_recovery=0。mysql自带估计分析慢查询日志,mysqldumpslow。分表:单表数据量过大,查询瓶颈。硬件层,系统层,软件层,应用层,架构层。在内存足够情况下,减少swap分区使用。分区: 数据放在不同的磁盘上,磁盘瓶颈。监控可视化zabbix。2,分库,分表,分区。
2024-10-22 10:41:13
1005
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人