- 博客(31)
- 收藏
- 关注
原创 MySQL索引
如果查询的列,通过索引项的信息可直接返回,则该索引称为查询SQL的覆盖索引。覆盖索引可以提高查询的效率。回表的影响● 性能损耗:回表本质是两次 B+ 树查询(二级索引 → 主键索引),相比直接查询主键索引,额外增加了 IO 操作,尤其是当查询结果集很大时,性能下降明显。● 优化方向:通过覆盖索引避免回表(让二级索引包含查询所需的所有字段,无需回表)。
2025-09-18 17:55:23
552
原创 MySQL事务
MySQL 为了解决数据一致性问题,提供了事务。事务可以将一系列的数据操作捆绑成一个整体进行统一管理,如果某一事务执行成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务执行时遇到错误,则就必须取消或回滚。取消或回滚后,数据将全部恢复到操作前的状态,所有数据的更改均被清除。
2025-09-15 14:29:47
711
原创 UDP协议
UDP是User Datagram Protocol 的缩写。UDP不提供复杂的控制机制,利用IP提供面向无连接的通信服务。并且它是将应用程序发来的数据在收到的那一刻,立即按照原样发送到网络上的一种机制。所以,即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中即使出现丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。如果需要这些细节控制,那么不得不交由采用UDP的应用程序去处理。
2025-09-11 17:41:00
366
原创 TCP协议
TCP协议在保证可靠性传输的过程中,针对数据在传输过程中,可能存在数据报文段丢失的情况,会采用不同的机制进行重新传输:● 超时重传● 快速重传● SACKTCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。如果你说完一句话,我在处理其他事情,没有及时回复你,那你不是要干等着我做完其他事情后,我回复你,你才能说下一句话,很显然这不现实。
2025-09-11 16:30:19
715
原创 HTTP协议
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于服务器与客户端浏览器之间传输超文本数据(文字、图片、视频、音频)的应用层协议。HTTP是一个属于应用层的协议,同时也是一个双向协议,基于浏览器-服务器架构模型进行工作。浏览器 与 服务器之间,基于http协议进行通信 ,浏览器发送请求数据给服务器,服务器根据接收到并处理请求后,向浏览器发送响应信息。
2025-09-09 23:14:30
1366
原创 计算机网络模型
网络通信是一个复杂的系统工程 —— 从用户在手机上点击 “发送” 按钮,到数据跨越千里到达目标设备,需要完成 “数据打包、地址标记、路径选择、错误校验、格式转换” 等一系列操作。网络模型分层(如 OSI 七层模型、TCP/IP 四层模型)本质是 “将复杂问题拆解为可管理的子问题”计算机网络从底层的传输到高层的软件设计十分复杂,要合理地设计计算机网络模型,必须采用分层模型,每一层负责处理自己的操作。在这个模型中,每个分层都接收由它的下一层所提供的特定服务,并且负责为自己的上一层提供特定的服务。
2025-09-09 16:11:48
1192
原创 JVM垃圾收集器
G1 ( Garbage-First ) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器、大容量内存的机器。它不再严格按照分代思想进行垃圾回收。G1 采用局部性收集的思想,对于堆空间的划分,采用Region为单位的内存划分方式:G1 垃圾回收器把堆划分成若干个大小相同的独立区域(Region)(按照JVM的实现,Region的数量不会超过2048个):每个 Region 都会代表某一种角色,H、S、E、O。
2025-09-09 10:01:37
751
原创 Java内存模型
对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序把内存控制权利交给 JVM虚拟机。一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。
2025-09-08 19:22:37
849
原创 Java类加载机制
两个类相等,需要类本身相等,包括类的 Class 对象的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回结果为 true,也包括使用 instanceof 关键字做对象所属关系判定结果为 true。除此之外,还要求两个类使用同一个类加载器进行加载,因为每一个类加载器都拥有一个独立的类名称空间。
2025-09-07 22:12:05
851
原创 JVM基础概念
作为一名Java菜鸟工程师,未来的你,面对生产环境中正在运行的线上系统,往往会遇到如下场景:● 线上系统突然宕机,系统无法访问,甚至直接OOM;● 线上系统响应速度太慢,优化系统性能过程中发现CPU占用过高,原因是因为JVM的 GC次数过于频繁;● 新项目上线,需要对JVM的各种参数进行设置;面对上述实际工作中产生的问题,都需要对JVM有全面的掌握和了解。
2025-09-07 21:51:14
797
原创 动态代理模式
给某一个对象提供一个代理,并由代理对象来控制对真实对象的访问。代理模式是一种结构型设计模式。代理模式角色分为 3 种:● Subject(抽象主题角色):定义代理类和真实主题的公共对外方法,通常被设计成接口;● RealSubject(真实主题角色):真正实现业务逻辑的类;● Proxy(代理主题角色):用来代理和封装真实主题;代理模式的结构比较简单,其核心是代理类,为了让客户端能够一致性地对待真是对象和代理对象,在代理模式中引入了抽象层。
2025-09-05 15:03:40
1047
原创 Class类
Java反射机制事Java语言的一个重要特性。首先我们先介绍两个概念:编译期和运行期。编译期:是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作。比如:检查语法错误。运行期:是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。
2025-09-04 17:28:59
800
原创 对锁的总结
偏向锁通过对比Mark Word解决加锁问题,避免执行CAS操作。而轻量级锁是通过用CAS操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。重量级锁是将除了拥有锁的线程以外的线程都阻塞。
2025-09-03 23:12:44
762
原创 ReetrantLock可重入锁
FairSync类也继承了 Sync类,表示采用公平策略获取锁:当资源空闲时,它总是会先判断同步队列中,是否有等待时间更长的线程,如果存在,则将当前线程加入到等待队列的尾部,实现了公平获取原则。NonfairSync 类继承了 Sync类,表示采用非公平策略获取锁:每一次都尝试获取锁,不会按照公平等待的原则进行等待,不会让等待时间最久的线程获得锁。ReentrantLock(boolean) 构造函数:可以传递参数确定采用公平策略或者是非公平策略,参数为 true表示公平策略,否则,采用非公平策略。
2025-09-03 15:16:33
677
原创 Synchronized的实现原理
synchronized 实现原理主要基于 对象头和 Monitor(监视器)机制。对象头:每个 Java 对象都有一个对象头,其中的 Mark Word 会记录锁状态(无锁、偏向锁、轻量级锁、重量级锁)。Monitor:每个对象都关联一个 Monitor监视器,由它来实现线程的同步机制。所以,线程获取锁,实际上是获取锁对象关联的 Monitor监视器,未获取到的线程会被阻塞,并进入等待队列。
2025-09-02 23:50:44
934
原创 简单介绍Synchronized锁升级和降级
Synchronized是用于实现线程同步的核心关键,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能阻塞在那里。所以它能确保同一时刻下只有一个线程可移植性被保护的代码块或方法,从而避免多线程环境下的数据竞争不一致问题。
2025-09-02 19:08:32
770
原创 Synchronized
结合上述案例,保证一段代码的原子性,就是通过加锁和解锁实现的。在Java的多线程中,使用synchronied关键字对一个对象进行加锁。Synchronized关机键字可以理解为是一种同步锁。简单来说,使用synchronized关键字将一段逻辑代码用一把锁给锁起来,只有获得了这把锁的线程才能访问。并且在同一时刻,只有一个线程能够持有这把锁,这样就保证了同一时刻只有一个线程可以执行被锁住的代码,从而保证了代码的线程安全。n = n + 1;
2025-09-01 23:54:12
643
原创 Integer缓存池
Integer 缓存池是 Java 中一个经典的性能优化机制,它让小整数对象得以复用,避免频繁创建。但同时也容易让人掉进 == 和 equals 的陷阱。
2025-09-01 17:17:10
968
原创 浅谈AQS
AQS的核心思想是:如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;如果共享资源被占用,就需要实现等待机制,来保证锁的分配。这种等待机制主要是基于CLH队列(一种虚拟双向队列)实现,将暂时获取不到锁的线程加入到该队列中,实现队列等待。CLH队列是Craig、Landin、Hagersten三个人发明的一种基于链表的队列,AQS中的队列是CLH变体,一种虚拟双向队列(FIFO),虚拟双向队列的意思是不存在队列实例,进存在节点之间的关联关系。
2025-08-29 23:52:58
782
原创 SpingBoot的的自动装配类
Spring Boot 的自动装配就是框架根据项目中引入的依赖库和一些预定义的规则,自动为应用程序配置 Spring 的各种组件。在传统的 Spring 开发中,我们需要手动配置大量的 XML 文件或者 Java 配置类来定义 Bean 及其依赖关系。例如,配置一个数据库连接池,需要手动创建数据源(DataSource)、事务管理器(TransactionManager)等相关 Bean,并且要确保它们之间的依赖关系正确无误。
2025-08-24 23:03:15
912
原创 Spring Bean的生命周期
在Spring框架中,Spring Bean是指由Spring IOC容器管理的对象。它是Spring应用的核心组件,所有业务逻辑、数据访问、服务等功能通常都通过Spring Bean实现。 Spring Bean的生命周期是Spring IOC容器管理Bean从创建到销毁的完整过程,包含多个关键节点和扩展点。 Spring Bean的生命周期主要分为四个阶段:实例化、属性注入、初始化、销毁。 根据配置文件中的Bean的定义,利用Java Reflection反射技术创建
2025-08-17 13:08:54
821
原创 Mybatis的工作原理
Mybatis是一个基于SQL映射机制的持久化层框架,它内部封装了加载驱动、创建连接、创建Statement等繁琐冗余的JDBC操作步骤过程,开始时只需要关注SQL语句的编写与映射配置,不用考虑如何执行以及执行结果的封装,并且可以控制SQL语句的便携与优化,有利于执行性能,灵活度高。Mybatis的特点是半自动化,通过使用XML或注解的方式来映射SQL语句,映射查询结果,避免了重复操作。
2025-08-13 19:09:41
648
原创 Executor的工作原理
BatchExecutor:一批处理方式执行update、insert、delete等操作(没有select查询操作,因为JDBC批处理不支持select查询),将所有sql都添加到批处理中(addBatch()),等待同意执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待注意执行executeBatch()批处理,与JDBC批处理相同。否则需手动调用 commit()。
2025-08-10 21:05:18
981
原创 Mapper接口的工作原理
在Mybatis中,Mapper接口(又称为映射器接口)是开发者定义的用于操作数据库的接口,其核心点是只需要定义方法签名,无需编写实现类,就能直接通过接口方法执行对应的SQL操作。这一机制的底层以来JDK动态代理和Mybatis的核心组件协作。一个普通的Mapper接口如下:其核心作用是:作为SQL操作的“入口”,通过方法签名关联对应的SQL语句,提供类型安全的调用方法(编译期校验方法名、参数类型),避免直接使用字符串拼接SQL带来的风险。
2025-08-09 22:23:50
784
原创 StringBuilder类的数据结构和扩容方式解读
在Java中,String类是不可变的,但在很多场景下,我们需要改变字符串,StringBuilder就是为此而生的。StringBuilder类是一个常用的用于处理字符串的类,它与String不同,它是可变的字符序列。本篇文章将详细阐述StringBuilder类的数据结构和对其扩容方式进行解读。以上就是今天要讲的内容,通过对 StringBuilder 类的数据结构和扩容方式的解读,我们可以更好地理解其内部实现原理,从而在实际编程中更高效地使用 StringBuilder 类来处理字符串。三、
2025-02-28 00:16:13
607
原创 String类的equals()的作用和源代码解读
在前期的学习中,我们了解了“==”运算符,基本数据类型使用“==”用于比较值,引用数据类型使用“==”用来比较内存地址。但若要比较引用数据类型的值时,“==”便不够用了,所以Java为我们提供了一个新的方法——equals(),用以比较两个引用数据类型的值。下面我们以String类为例来了解一下equals()方法吧!以上就是今天要讲的内容,本文介绍了equals方法的由来和源代码的注释解读,我们能更清晰的掌握其原理,进而在之后的编程练习中能更准确的运用该方法进行对字符串内容的比较。
2025-02-26 17:40:18
326
原创 String为什么是不可变的?
说明,replace()方法并没有改变s的值,通过查看replace()方法的源代码我们可知,其返回的是一个新的字符串,即通过方法中的StringBuilder新建并进行连接的字符串。这个方法返回一个新的字符串,包含原始字符串和传入字符串的内容。编程苦手们应该会发现,所有对于字符串的操作,原字符串均不改变,这也是我们本篇文章所探讨的问题,归根结底,String类的不可变性还需探究它的内部结构。由图9知,该方法虽由s调用,但并未改变原字符串s的值,而是返回一个新的字符串,接收连接好的字符串。
2025-01-19 23:51:15
444
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅