- 博客(74)
- 收藏
- 关注
原创 MyBatis基础操作完整指南
MyBatis是Apache的一个开源项目,前身是iBatis。它是一个基于Java的持久层框架,主要特点包括:相比Hibernate等ORM框架,MyBatis更加轻量级,并且支持自定义SQL,能够充分利用数据库特性。
2025-08-06 21:35:57
398
原创 Mybatis中的SQL注入问题
小明在运行SpringBoot + Mybatis项目时发现了一个致命问题,那就是无论用户名是什么,只要输入的密码是,都可以登录系统。
2025-08-06 18:05:26
505
原创 MySQL间隙锁在查询时锁定的范围
规则说明示例记录存在加临键锁 = 记录锁 + 间隙锁value=20→记录不存在只加间隙锁value=25→(20,30)范围查询锁定所有可能插入影响结果的间隙value>20→边界保护查询边界外也要锁定相邻间隙→ 还要锁(40,50)
2025-08-05 22:16:52
318
原创 MVCC的实现原理
为什么在MySQL中,一个事务在读取数据的时候,另一个事务同时修改同一条数据,读事务却不会被阻塞?这背后的功臣就是MVCC。MVCC(多版本并发控制),是一种并发控制方法,主要用于数据库管理系统中,同时为事务提供对数据库的并发访问。MVCC让数据库可以为同一行数据维护多个版本,不同的事务可以看到不同版本的数据,从而实现不加锁的情况下解决读写冲突。
2025-08-03 10:42:31
881
原创 MySQL索引解析
索引是数据库性能优化的重要手段,但也不是万能的。要 掌握最左前缀原则,合理设计复合索引,避免常见的索引失效场景,在优化方面通过EXPLAIN分析执行计划。
2025-08-02 21:18:54
890
原创 从输入URL到页面显示的过程
每天我们都会打开浏览器,输入网址,然后看到网页内容。这个过程看似简单,但背后其实发生了很多有趣的事情。今天我们就来详细聊聊,当你在浏览器地址栏输入并按下回车键后,到底发生了什么。
2025-08-02 12:46:54
1006
原创 三次握手和四次挥手
三次握手是TCP建立连接的过程。客户端和服务器也需要相互确认对方的存在,然后才能开始正式的数据传输。四次挥手是TCP断开连接的过程。相比建立连接,断开连接稍微复杂一些,因为TCP是全双工通信,需要分别关闭两个方向的数据传输。TCP的三次握手和四次挥手看似复杂,但其实就是为了确保数据传输的可靠性。三次握手确保双方都准备好了通信,四次挥手确保双方都优雅地结束了通信。希望这篇文章能帮助你更好地理解TCP协议的工作原理。
2025-08-02 09:28:19
934
原创 TCP协议的特点和首部格式
TCP协议的核心思想就是"可靠"二字,通过序列号、确认应答、超时重传等机制,确保数据能够准确、完整、有序地到达目的地。
2025-08-01 22:43:27
794
原创 HTTPS的工作原理
HTTPS通过SSL/TLS协议,在HTTP基础上添加了加密、身份验证和数据完整性保护。其核心是握手建立安全通道,使用非对称加密交换会话密钥,再用对称加密传输数据,确保通信安全。
2025-08-01 20:26:55
766
原创 理解HTTP协议
HTTP(HyperText Transfer Protocol)超文本传输协议,当你在地址栏输入一个网址,浏览器就会用HTTP协议向服务器发起请求,服务器再用HTTP协议把网页内容返回给你。HTTP协议定义了客户端如何向服务器请求数据,服务器如何响应请求,以及数据如何在网络中传输。GET请求应该是幂等的,也就是说多次执行同一个GET请求的结果应该是一样的。不要所有接口都返回200,根据实际情况选择合适的状态码,也可以定义枚举类来表示。:包含请求方法、URL和HTTP版本。用于删除资源,也应该是幂等的。
2025-08-01 19:41:18
971
原创 SPI机制
SPI全称为Service Provider Interface,即服务提供者接口。它是JDK内置的一种服务发现机制,SPI机制允许第三方为接口提供实现,主程序通过SPI机制自动发现并加载这些实现。这种设计模式在很多知名框架中都有应用,比如JDBC驱动加载、Spring Boot的自动配置等。SPI机制虽然看起来简单,但它体现了优秀的设计思想:面向接口编程、依赖倒置、开闭原则。在需要插件化扩展或者第三方集成的场景下,SPI提供了一种轻量级、标准化的解决方案。它是用ServiceLoader来动态的加载。
2025-08-01 08:28:48
292
原创 Java对象是如何在堆内存中分配的?
Java 虚拟机(JVM)的堆内存是用于存储对象和数组的运行时数据区域。年轻代:包括 Eden 区和两个 Survivor 区(S0 和 S1),用于存放新创建的对象。老年代:存储生命周期较长的对象。元空间:存储类元数据、方法信息等,取代了 Java 8 前的永久代。对象分配主要发生在年轻代的 Eden 区,这是我们关注的重点。Java 对象的堆内存分配和垃圾回收是一个高效且复杂的过程。
2025-07-31 22:50:54
457
原创 计算机网络模型
想象一下,如果没有统一的标准,每个厂商都按照自己的想法来设计网络协议,那会是什么样子?华为的设备和思科的设备可能根本无法通信,微信和QQ也许永远连不到一个网络上。它把复杂的网络通信过程分解成若干个层次,每一层都有明确的职责,层与层之间通过标准接口通信。在物理层的基础上,提供节点到节点的可靠传输。负责数据包的路由选择,决定数据从源主机到目标主机的最佳路径。IP协议是这一层的代表。直接为用户提供服务的层面,比如HTTP、FTP、SMTP等协议都在这一层。对应OSI的物理层和数据链路层,处理硬件相关的细节。
2025-07-31 21:10:01
234
原创 Java类加载器与双亲委派模型
简单来说,类加载器就是负责把.class文件加载到JVM内存中,并转换成可以被JVM使用的Class对象的组件。// 1. 先检查是否已经加载过Class<?if (clazz!= null) {// 2. 这里是关键:我们改变了加载顺序// 对于我们关心的包,先尝试自己加载System.out.println("自定义加载器优先加载: " + name);= null) {// 自己加载失败,再委派给父加载器。
2025-07-27 14:52:15
285
原创 多线程进阶知识篇(三)
多线程编程中最头疼的就是数据安全问题。当多个线程同时操作共享数据时,很容易出现数据的不一致。今天我们来聊聊Java中的并发安全集合以及AQS框架。ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue这些并发集合各有特色,适用于不同的场景。而AQS作为底层框架,为我们提供了构建同步工具的基础。最重要的是:并发编程的目标不仅仅是保证线程安全,还要兼顾性能。
2025-07-27 09:13:51
777
原创 三色标记法
白色:未被访问的对象,垃圾回收结束后,白色对象将被回收灰色:已被访问但其引用的对象还未完全扫描的对象黑色:已被访问且其引用的所有对象都已扫描完毕的对象。
2025-07-27 08:52:26
288
原创 JVM常见工具
当服务器上跑了多个Java应用,你想知道哪个进程是你要监控的时候,jps就派上用场了。从Arthas的一些基本命令我们就可以得到非常丰富、全面的信息,比之前的命令行工具好用多了。Arthas是阿里开源的Java诊断工具,可以说是目前最好用的线上诊断工具,没有之一。这个工具主要用来分析内存使用情况,特别是在发生内存溢出时,它能帮你保留现场。这是最基础的工具,相当于Linux的ps命令,专门用来查看Java进程。JConsole是JDK自带的图形化监控工具,界面简单直观。就能找到对应的进程ID。
2025-07-26 19:15:14
732
原创 垃圾回收算法与垃圾收集器
和Parallel Scavenge一起使用,整体注重吞吐量。:一边让程序正常跑,一边慢慢标记所有要清理的对象。:快速标记一下根源对象,这个过程需要暂停程序。:暂停程序,选择最值得清理的区域进行回收。:再暂停一下程序,修正错标、漏标的对象。:快速标记根源对象,需要暂停程序。:程序正常跑的同时进行标记工作。:暂停程序,处理并发期间的变化。:一边让程序跑,一边清理垃圾。同样使用标记-整理算法。主要用在客户端程序上。
2025-07-26 18:47:07
1107
原创 JVM参数
年轻代主要存放新创建的对象,如果你的应用创建对象很频繁,可以适当增大年轻代。一般建议年轻代占堆内存的1/3到1/4。建议在生产环境中把这两个值设置成一样,避免JVM在运行过程中动态调整堆大小,减少性能开销。方法区存放类的信息,如果你的应用加载了很多类,就需要增大这个区域。G1是目前比较推荐的垃圾回收器,特别适合大内存的应用。线上环境建议开启GC日志,方便排查性能问题。设置JVM启动时的初始堆内存大小,
2025-07-26 18:24:57
234
原创 JVM 内存结构
大家好,你有没有想过:我们写的 Java 程序,new 出来的对象去了哪?这些问题的答案,其实都藏在里。今天,带你们搞清楚 JVM 是什么划分内存区域的。
2025-07-24 19:42:14
817
原创 线程池的状态
ThreadPoolExecutor使用一个32位的原子整数来同时存储线程池状态和工作线程数。高3位用于存储状态,低29位用于存储线程数。// ThreadPoolExecutor源码中的状态定义这五种状态按照生命周期顺序分别是:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。线程池的状态管理是并发编程中的重要概念。
2025-07-20 11:13:53
350
原创 线程池的核心配置参数和流程
线程池是Java并发编程的重要工具,正确配置线程池参数对应用性能至关重要。核心线程数决定了基础处理能力,最大线程数提供了弹性扩容能力,工作队列起到了缓冲作用,拒绝策略则是最后的保护机制。
2025-07-20 10:38:24
897
原创 ReentrantLock和synchronized的区别
synchronized的一个重要优势是锁的获取和释放是自动的。synchronized不支持中断,如果一个线程在等待synchronized锁时被阻塞了,就只能一直等下去,无法响应中断。从使用方式上看,synchronized更简洁,而ReentrantLock需要显式地获取和释放锁,但这也给了我们更多的控制权。公平锁保证了等待时间最长的线程优先获得锁,但性能会比非公平锁差一些,因为需要维护一个有序的等待队列。这种方式可以让生产者只唤醒消费者,消费者只唤醒生产者,避免了不必要的线程唤醒,提高了效率。
2025-07-19 19:21:32
288
原创 单例模式的设计与实现
单例模式可能是我们在开发中用得最多的设计模式之一,但要在多线程环境下正确实现单例模式却不是那么简单。今天我们就来看看如何正确地实现线程安全的单例模式。
2025-07-19 18:49:58
748
原创 synchronized锁升级机制
在日常开发中,我们经常使用synchronized来保证线程安全,但很多人可能不知道这个关键字在JVM内部经历了怎样的优化过程。早期版本的synchronized性能确实不太理想,但现在已经通过锁升级机制得到了很大改善。
2025-07-19 17:48:24
930
原创 谈谈CAS的理解
在多线程并发环境下,我们要加锁来保证线程安全,防止出现数据不一致的情况,但是无论是synchronized还是ReentrantLock,在加锁和释放锁时都要依赖于操作系统,开销不小。CAS。CAS 的全称是 Compare And Swap(比较与交换),其思想很简单,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新。CAS 是一个原子操作,是一种无锁并发的思想,它底层用到的是CPU指令来保证共享变量的原子性。
2025-07-19 12:06:26
320
原创 ThreadLocal的应用
在多线程环境下,我们经常遇到这样的问题:多个线程需要访问同一个变量,但又希望每个线程都有自己独立的副本。这时候ThreadLocal就派上用场了。
2025-07-19 11:15:51
881
原创 线程安全集合——ConcurrentHashMap
在多线程开发中,HashMap虽然性能很好,但它不是线程安全的,在并发环境下可能会出现数据不一致甚至死循环的问题。虽然我们可以使用Hashtable或Collections.synchronizedMap()来获得线程安全的Map,但它们的性能在高并发场景下并不理想。这时候,ConcurrentHashMap就派上用场了。// 简化版的put方法逻辑// 1. 计算hash值// 2. 根据hash值找到对应的桶// 3. 如果桶为空,使用CAS操作插入// CAS操作,无锁插入。
2025-07-18 13:03:14
520
原创 线程安全集合——CopyOnWriteArrayList
是一个线程安全的集合,是List接口的实现类。它是用ReentrantLock来保证线程安全的,其用法和List接口下其他的实现类相差不大。
2025-07-17 12:54:51
265
原创 电商秒杀系统中的一人一单
数据库唯一索引:实现简单,数据一致性最好,适合并发量不高的场景JVM级别的锁:性能较好,但只能解决单机并发问题分布式锁:适合集群环境,能处理高并发,但实现复杂度最高在实际项目中,我们可以根据系统架构和业务需求选择合适的方案。
2025-07-11 13:26:04
377
原创 电商秒杀系统中的超卖问题
作为一名后端开发,最近在练习电商平台的秒杀模块开发。说实话,秒杀系统看起来简单,但真正做起来坑特别多。这不,刚上线没多久就遇到了经典的超卖问题,库存直接变成负数。今天就来分享一下这次踩坑的经历和最终的解决方案。
2025-07-06 10:25:23
642
原创 Web开发中的会话、Cookie和Session
HTTP(超文本传输协议)是一种无状态协议,简单来说就是服务器不会记住你。每次你发送请求,对服务器来说都是全新的,它不知道这个请求是不是你之前发过的。服务器处理完请求后就会忘记这次交互,就像金鱼的记忆一样。这种设计虽然让协议变得简单,但也带来了一个问题:你登录了一个网站,刷新页面后怎么让服务器知道你还是刚才那个已经登录的用户?这就需要用到会话管理技术了。会话是用户与应用交互的抽象概念Cookie是在客户端存储数据的技术手段Session是在服务端管理用户状态的机制。
2025-06-26 20:00:27
318
原创 Java项目中使用到的技术——《异步调用》
说起异步调用,我想起刚学习微服务那会儿做的一个电商项目。用户下单后,系统要扣库存、发短信、记日志…一大堆操作。当时图省事,全部写在一个接口里同步执行。结果用户点完下单按钮,页面要转10多秒才有反应,用户还以为系统卡死了,经常重复点击。后来排查发现,发短信的第三方接口响应特别慢,所有订单请求都堵在那里等着。那一刻才真正意识到异步调用的重要性。现在回头看,异步调用不仅仅是技术优化,更是用户体验的保证。今天就来聊聊Spring Boot中异步调用的各种实现方式,从最简单的@Async到消息队列。异步调用。
2025-06-15 17:53:09
935
原创 如何购买并配置服务器
在工作中服务器配置等方面的工作是运维人员的工作,但是作为开发人员也需要对这方面的知识有一点的了解,如:项目如何部署到服务器上,服务器CPU过载如何调优等。到这里关于服务器的购买的配置就讲完了,有什么疏漏的地方还请各位学者批评指正。
2025-06-12 14:50:33
317
原创 类加载的过程
类加载是指虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程。类加载过程包含三个主要阶段:加载、连接和初始化。连接阶段又细分为验证、准备、解析三个子阶段。加载阶段:获取类的二进制字节流,转换为运行时数据结构,生成Class对象验证阶段:确保Class文件的字节流符合虚拟机要求,保证安全性准备阶段:为类变量分配内存并设置零值解析阶段:将符号引用替换为直接引用初始化阶段:执行类构造器,真正开始执行Java程序代码。
2025-06-08 09:27:42
711
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人