自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 再次理解 Spring 中的 IOC、DI、AOP 与多态

IOC(Inversion of Control)是一种设计原则,它将对象的创建和依赖关系的管理从应用程序代码中转移到框架或容器中。在 Spring 中,IOC 容器负责创建和管理 Bean 的生命周期。将对象的创建权力反转给Spring框架!DI(Dependency Injection)是 IOC 的一种实现方式,它通过将依赖关系注入到对象中,而不是由对象自己创建依赖。

2025-03-23 20:17:55 734

原创 深入理解 Java 中的多态、重写与重载

多态是指父类引用可以指向子类对象,但在调用方法时,实际执行的是子类重写的方法。编译时看左边(引用类型):编译器根据引用类型决定可以调用哪些方法。运行时看右边(实际对象类型):运行时根据实际对象类型决定调用哪个具体的方法。重写是指子类重新定义父类中的方法,方法名、参数列表和返回类型必须相同。重写的目的是扩展或修改父类方法的行为。重载是指在同一个类中,方法名相同但参数列表不同。重载的目的是提供多种方法实现,方便调用。特性多态重写重载定义父类引用指向子类对象,调用子类方法子类重新定义父类方法。

2025-03-22 19:57:16 1058

原创 MyBatis 中 #{} 和 ${} 的区别详解

MyBatis 是一个优秀的持久层框架,它简化了数据库操作,并提供了强大的 SQL 映射功能。在 MyBatis 中,#{}和${}是两种常用的占位符,用于动态替换 SQL 语句中的参数。尽管它们看起来相似,但它们在处理方式和安全性上有显著的区别。本文将详细探讨#{}和${}的区别,并分析它们的适用场景。

2025-03-22 16:06:09 1144

原创 MySQL 的主从复制详解

MySQL 主从复制(Master-Slave Replication)是一种数据复制技术,允许将一个 MySQL 数据库服务器(主服务器)的数据复制到一个或多个 MySQL 数据库服务器(从服务器)。主从复制的主要目的是实现数据的冗余备份、读写分离、负载均衡以及高可用性。MySQL 主从复制是一种非常实用的数据复制技术,能够有效提高系统的可用性、扩展性。

2025-03-22 14:18:04 1030

原创 深入理解MySQL日志机制

错误日志(Error Log):记录MySQL服务器运行过程中的错误信息。二进制日志(Binary Log):记录所有对数据库的修改操作,用于数据恢复和主从复制。查询日志(General Query Log):记录所有执行的SQL语句。慢查询日志(Slow Query Log):记录执行时间超过指定阈值的SQL语句。事务日志(Transaction Log):包括Redo Log和Undo Log,用于保证事务的原子性和持久性。中继日志(Relay Log)

2025-03-21 23:48:54 897

原创 深入理解MySQL中的MVCC机制

MVCC是MySQL实现高并发事务处理的核心技术之一。通过保存数据的多个版本,MVCC允许多个事务同时读取同一数据,而不会相互阻塞。Read View和Undo Log版本链是MVCC机制中的关键组件,它们决定了事务在读取数据时能看到哪些版本的数据。理解MVCC的工作原理和实现细节,可以帮助我们更好地设计和优化数据库应用,提高系统的并发性能和稳定性。

2025-03-21 23:42:38 871

原创 MySQL中的锁机制:从全局锁到行级锁

全局锁是一种数据库级别的锁,它会锁定整个数据库实例,阻止任何事务对数据库进行写操作。全局锁通常用于数据库备份或维护操作,以确保备份数据的一致性。MySQL中的锁机制是保证数据一致性和事务隔离性的重要手段。通过理解全局锁、表级锁、行级锁、意向锁、元数据锁以及锁的兼容性和死锁处理机制,可以更好地设计和优化数据库应用,提高系统的并发性能和稳定性。在实际应用中,应根据业务需求合理选择锁的类型和粒度,避免不必要的锁冲突,确保系统的高效运行。

2025-03-21 23:10:49 1009

原创 MySQL索引详解----看这一篇就够了

索引是数据库中用于加速数据检索的一种数据结构。它类似于书籍的目录,通过索引可以快速定位到数据的位置,而不需要扫描整个表。最左匹配原则是指在联合索引中,查询条件必须从索引的最左端开始,按照索引列的顺序依次匹配。如果查询条件没有从最左端开始,或者中间有列未匹配,索引将无法完全生效或部分失效。索引是MySQL中优化查询性能的重要工具。通过理解索引的结构、分类、使用方法和设计原则,可以显著提升数据库的查询效率。在实际应用中,需要根据具体的查询需求和数据特点,合理设计和使用索引。

2025-03-21 18:18:40 1060

原创 深入解析MySQL存储引擎:从InnoDB到MyISAM的技术全景

MySQL作为最流行的关系型数据库之一,其存储引擎架构设计为不同业务场景提供了灵活的选择。本文将全面剖析MySQL存储引擎的核心机制、实现原理及最佳实践,助您做出精准的技术选型决策。

2025-03-21 15:12:34 776

原创 Redis 持久化详解:RDB 与 AOF 的机制、配置与最佳实践

数据持久性:防止服务器重启或崩溃时数据丢失。数据备份:通过持久化文件可以备份数据,便于恢复。灾难恢复:在发生灾难性故障时,可以通过持久化文件恢复数据。Redis 的持久化机制是保证数据持久性的重要手段。RDB:适合备份和灾难恢复,性能高但数据安全性较低。AOF:适合高数据安全性要求的场景,数据安全性高但性能较低。

2025-03-11 17:29:32 1146

原创 Redis 缓存穿透、缓存击穿与缓存雪崩详解:问题、解决方案与最佳实践

缓存穿透是指查询一个不存在的数据,导致请求直接穿透缓存层,直接访问数据库。由于数据库中也不存在该数据,因此每次请求都会绕过缓存,直接访问数据库,从而导致数据库压力过大。缓存击穿是指某个热点数据在缓存中过期,同时有大量并发请求访问该数据,导致所有请求直接访问数据库,从而导致数据库压力激增。缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求直接访问数据库,从而导致数据库压力激增甚至崩溃。缓存穿透、缓存击穿和缓存雪崩是 Redis 使用过程中常见的问题,它们会导致数据库压力过大甚至系统崩溃。缓存穿透。

2025-03-11 03:14:03 1053

原创 Redis 哨兵模式详解:实现高可用与自动故障转移

Redis 哨兵模式是一种高可用性解决方案,通过部署多个哨兵节点来监控 Redis 主从节点的状态,并在主节点故障时自动进行故障转移。Redis 哨兵模式是一种高效、可靠的高可用性解决方案,适用于需要自动故障转移和读写分离的场景。

2025-03-11 02:42:30 1207

原创 Redis 主从复制详解:实现高可用与数据备份

Redis 主从复制是一种数据同步机制,允许将一个 Redis 实例(主节点)的数据复制到一个或多个 Redis 实例(从节点)。主节点负责处理写操作,而从节点负责复制主节点的数据,并提供读操作。Redis 主从复制是一种高效、简单的数据同步机制,适用于数据备份、读写分离、高可用性等场景。尽管它存在数据延迟和故障切换复杂的缺点,但在许多场景中仍然表现出色。

2025-03-11 01:59:01 810

原创 Redis 发布订阅模式详解:实现高效的消息通信

Redis 的发布订阅模式是一种消息通信机制,允许客户端通过频道(Channel)发送和接收消息。发布者(Publisher)将消息发送到指定的频道,而订阅者(Subscriber)可以订阅一个或多个频道,接收发布者发送的消息。Redis 发布订阅模式是一种高效、简单的消息通信机制,适用于实时消息通知、事件驱动架构、日志收集等场景。尽管它存在消息丢失和无确认机制的缺点,但在许多实时性要求高的场景中仍然表现出色。如果你需要更高级的消息队列功能,可以考虑使用 RabbitMQ 或 Kafka 等替代方案。

2025-03-10 22:41:10 1208

原创 中间件与分布式系统:现代计算架构的核心

分布式系统是由多台计算机(节点)通过网络连接组成的系统,这些节点协同工作以完成共同的任务。分布式系统的设计目标是利用多台计算机的资源,提供比单机系统更高的性能、可靠性和扩展性。中间件是位于操作系统和应用程序之间的软件层,它为应用程序提供通用的服务,如通信、数据管理、安全性和事务管理等。中间件的主要作用是简化分布式应用的开发,使开发者能够专注于业务逻辑,而不必关心底层的复杂性。

2025-03-10 21:24:57 943

原创 深入理解 ReentrantLock:可重入锁的特性与优势

可重入性:同一个线程可以多次获取同一把锁,而不会导致死锁。公平性:支持公平锁和非公平锁两种模式。灵活性:提供了比更灵活的锁操作,例如尝试获取锁、超时获取锁、可中断获取锁等。条件变量:支持多个条件变量(Condition),可以实现更复杂的线程通信。是 Java 并发编程中一个强大的锁工具,它提供了比更灵活和强大的功能,例如可重入性、公平性、尝试获取锁、超时获取锁、可中断获取锁以及条件变量等。在以下场景中,是更好的选择:需要更灵活的锁操作(如尝试获取锁、超时获取锁)。需要公平锁。

2025-03-07 20:36:24 861

原创 深入理解 AQS(AbstractQueuedSynchronizer):并发编程的核心

是 Java 并发包()中的一个抽象类,用于构建锁和其他同步器。同步状态管理:AQS 通过一个volatile的int类型变量(state)来表示同步状态。线程阻塞与唤醒:AQS 使用一个 FIFO 队列(双向链表)来管理等待获取锁的线程。模板方法模式:AQS 提供了一些模板方法(如tryAcquiretryRelease等),子类可以通过重写这些方法来实现自定义的同步逻辑。@Overrideif (compareAndSetState(0, 1)) { // 尝试将 state 从 0 改为 1。

2025-03-07 20:31:17 1116

原创 深入理解 CAS 与 ABA 问题

CAS(Compare-And-Swap)是一种原子操作,用于在多线程环境下实现无锁的线程安全。比较:检查某个内存位置的值是否与预期值相等。交换:如果相等,则将该内存位置的值更新为新值;否则,不做任何操作。CAS 操作是原子的,即在执行过程中不会被其他线程打断。ABA 问题是 CAS 操作中的一个经典问题。它描述的是以下场景:线程 1 读取变量 V 的值为 A。线程 1 被挂起。线程 2 将变量 V 的值从 A 修改为 B。线程 2 再次将变量 V 的值从 B 修改回 A。

2025-03-07 20:10:40 855

原创 单例模式:确保一个类只有一个实例

单例模式是一种简单但强大的设计模式,适用于需要全局唯一实例的场景。通过不同的实现方式(如饿汉式、懒汉式、双重检查锁定、静态内部类、枚举等),可以满足不同的需求。在实际开发中,应根据具体场景选择合适的单例实现方式。如果需要懒加载且线程安全,推荐使用静态内部类或枚举实现;如果需要更高的性能,可以考虑双重检查锁定。

2025-03-07 17:06:51 1023

原创 理解 Java 内存模型(JMM)与 volatile 关键字 以及 指令重排

Java 内存模型(JMM)定义了多线程环境下变量的访问规则,确保可见性、有序性和原子性。volatile关键字是 JMM 中的一种轻量级同步机制,用于保证变量的可见性和有序性,但它不能保证原子性。在多线程编程中,合理使用volatile可以避免一些常见的并发问题,但在需要原子操作的场景中,仍需使用其他同步机制。

2025-03-07 16:20:38 980

原创 Fork/Join 框架详解:分支合并的高性能并发编程

Fork(分解):将一个大任务拆分为多个小任务。Join(合并):将小任务的结果合并为最终结果。Fork/Join 框架通过工作窃取算法(Work-Stealing Algorithm)实现任务的动态分配和负载均衡,从而充分利用多核 CPU 的性能。Fork/Join 框架是 Java 并发编程中非常强大的工具,特别适合解决可以分解为多个子任务的问题。通过本文的介绍,你应该已经掌握了 Fork/Join 框架的核心概念、使用步骤以及实际示例。Fork/Join 框架的核心组件和。使用步骤。

2025-03-06 21:51:14 900

原创 Java 8 Stream API 详解

Stream 是 Java 8 中处理集合数据的抽象工具。它并不是数据结构,而是一种对数据源(如集合、数组等)进行高效聚合操作的工具。声明式编程:通过链式调用方法描述数据处理逻辑。惰性求值:中间操作不会立即执行,只有在终端操作触发时才会执行。并行处理:可以轻松实现并行操作,充分利用多核 CPU。Stream API 是 Java 8 中非常强大的工具,它通过声明式的方式简化了集合数据的处理。通过掌握 Stream 的创建、中间操作和终端操作,你可以写出更简洁、高效的代码。Stream 的创建。

2025-03-06 21:42:36 772

原创 Java 8 四大函数式接口详解

函数式接口是只有一个抽象方法的接口。Java 8 通过注解来标识函数式接口。虽然这个注解不是强制性的,但建议使用它来确保接口符合函数式接口的定义。// 只有一个抽象方法表示接受一个输入参数并返回无结果的操作。表示一个无参数但返回一个结果的供给操作。T get();表示接受一个输入参数并返回一个结果的函数。表示一个接受输入参数并返回布尔值的断言。Java 8 的四大函数式接口(ConsumerSupplierFunctionPredicate)为函数式编程提供了强大的支持。

2025-03-06 20:45:36 826

原创 线程池详解:三大方法、七大参数、四大拒绝策略

线程池是多线程编程中的核心工具,合理地使用线程池可以显著提高系统的性能和稳定性。通过本文的介绍,你应该已经掌握了线程池的三大创建方法、七大核心参数以及四大拒绝策略。在实际开发中,要具体需求手动配置线程池,避免使用Executors的默认方法,从而更好地控制线程池的行为。

2025-03-06 19:52:08 822

原创 BlockingQueue详解及其四组API

是一个支持阻塞操作的队列接口,它继承自Queue接口。线程安全:所有操作都是线程安全的,多个线程可以安全地访问同一个。阻塞操作:当队列为空时,消费者线程会被阻塞,直到队列中有新的元素;当队列满时,生产者线程会被阻塞,直到队列中有空闲空间。容量限制可以是有界队列(容量有限)或无界队列(容量无限)。阻塞队列是一个队列,在数据结构中起的作用如下图:当队列是空的,从队列中获取元素的操作将会被阻塞。当队列是满的,从队列中添加元素的操作将会被阻塞。

2025-03-06 18:54:54 1014

原创 深入理解 synchronized、Lock 与死锁

Lock死锁是指两个或多个线程互相持有对方所需的资源,导致所有线程都无法继续执行的状态。:简单易用,适合低竞争场景。Lock:功能强大,适合高竞争场景。死锁:通过破坏死锁的四个必要条件来避免。

2025-03-03 01:14:52 687

原创 线程状态与线程方法详解

在 Java 中,线程的生命周期可以分为多种状态。这些状态定义在线程的状态和方法是多线程编程的核心内容。通过理解线程的状态转换和掌握常用的线程方法,可以更好地控制线程的行为,编写出高效、稳定的多线程程序。线程状态常用方法start()sleep()wait()notify()join()等。

2025-03-02 21:58:46 993

原创 Lambda 表达式:简化代码的利器

Lambda 表达式是 Java 8 引入的一种简洁的匿名函数表示方式。它允许你将函数作为参数传递给方法,或者将代码块作为数据处理。Lambda 表达式的主要目的是简化代码,尤其是在使用函数式接口时。Lambda 表达式是 Java 8 引入的一项重要特性,它通过简洁的语法和强大的功能,极大地简化了代码的编写。无论是替代匿名内部类、遍历集合,还是进行复杂的集合操作,Lambda 表达式都能显著提高代码的可读性和可维护性。

2025-03-02 20:49:38 624

原创 线程介绍及 Java 实现线程的三种方式

线程(Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但每个线程拥有独立的执行栈和程序计数器。线程是实现并发编程的重要工具,能够提高程序的执行效率和响应性。然而,多线程编程也带来了复杂性和调试困难。通过合理地使用线程同步机制,可以避免竞态条件和死锁等问题。在 Java 中,实现线程主要有三种方式:继承Thread类、实现Runnable接口和使用Callable和Future。

2025-03-02 19:40:20 462

原创 JVM内存模型详解:各个区域的作用与原理

方法区(Method Area)堆(Heap)栈(Stack)本地方法栈(Native Method Stack)程序计数器(Program Counter Register)这些区域共同协作,确保Java程序的正常运行。下面我们将逐一介绍这些区域。JVM内存模型是Java程序运行的基础,理解各个内存区域的作用和原理对于编写高效、稳定的Java程序至关重要。方法区:存储类信息、常量、静态变量等。堆:存储对象实例和数组,是垃圾回收的主要区域。栈:存储局部变量和方法调用,线程私有。本地方法栈。

2025-02-28 23:24:24 988

原创 GC垃圾回收介绍及GC算法详解

目录引言GC的作用域什么是垃圾回收?常见的GC算法1.引用计数法2.复制算法3.标记清除4.标记整理小总结5.分代收集算法ps:可达性分析算法?可达性分析的作用可达性分析与垃圾回收算法的关系结论在编程世界中,内存管理是一个至关重要的话题。对于使用自动内存管理的语言(如Java、Python、Go等),垃圾回收(Garbage Collection, GC)机制是确保程序高效运行的关键。本文将介绍垃圾回收的基本概念,并详细讲解四种常见的垃圾回收算法。记住GC口诀: 分代收集算法次数频繁Young区,次数较少O

2025-02-28 23:06:23 1122

原创 OOM故障排查指南:生成 JVM 内存快照并使用快照分析工具定位问题

Heap Dump是 JVM 堆内存的静态快照,它记录了堆内存中所有对象的详细信息,包括:对象的类型和数量。对象的大小。对象的引用关系。通过分析 Heap Dump,开发者可以快速定位内存泄漏、内存占用过高或其他内存相关问题。排查OOM故障的关键在于生成和分析堆内存快照(Heap Dump)。通过使用JProfiler和VisualVM等工具,开发者可以快速定位内存泄漏、内存分配过大或资源竞争等问题。生成 Heap Dump通过 JVM 参数自动生成,或使用 IDEA 内置工具手动生成。

2025-02-28 01:49:03 963

原创 OOM的原因到底是内存泄漏还是内存溢出?

是指应用程序在运行过程中,无法从操作系统分配到足够的内存,从而导致程序崩溃或异常终止。Java应用程序:抛出。Linux系统:触发OOM Killer,强制终止占用内存过多的进程。容器环境:如Docker容器因内存限制而崩溃。内存泄漏是指应用程序分配的内存未能正确释放,导致内存使用量持续增长。内存溢出是指应用程序一次性申请的内存超过了可用内存,导致无法分配所需内存。OOM的原因既可能是内存泄漏,也可能是内存溢出,还可能是其他因素(如资源竞争、外部依赖问题)。

2025-02-28 00:56:09 818

原创 Cookie与Session:Web开发中的状态管理机制

Cookie是服务器发送到客户端(通常是浏览器)并存储在客户端的一小段数据。每次客户端向服务器发送请求时,都会自动携带这些Cookie数据,从而实现状态的保持。Session是服务器端的一种状态管理机制。服务器会为每个客户端创建一个唯一的Session对象,并将Session ID通过Cookie或URL传递给客户端。客户端在后续请求中携带Session ID,服务器通过Session ID找到对应的Session数据。Cookie是一种客户端状态管理机制,适合存储小型、非敏感数据。Session。

2025-02-27 22:28:03 535

原创 当我在浏览器中输入www.xxx.com到底发生了什么?

从输入DNS解析:将域名转换为IP地址。TCP连接:通过三次握手建立可靠的通信通道。HTTP请求与响应:浏览器发送请求,服务器返回响应。页面渲染:浏览器解析HTML、CSS和JavaScript,渲染页面。关闭连接:通过四次挥手关闭TCP连接。这些步骤看似复杂,但通常在一秒内完成,为用户提供了流畅的浏览体验。理解这个过程有助于我们更好地优化网站性能,解决网络问题。

2025-02-27 22:04:58 5716

原创 TCP的三次握手与四次挥手:建立与终止连接的关键步骤

MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。

2025-02-27 21:57:03 1414

原创 DNS的解析流程

5、这里补充说明,一旦递归服务器拿到解析记录以后,就会在本地进行缓存,如果下次客户端再请求本地的递归域名服务器相同域名的时候,就不会再这样一层一层查了,因为本地服务器里面已经有缓存了,这个时候就直接把。顶级域名服务器负责返回权威域名服务器的地址。例如,对于.com域名,顶级域名服务器会返回负责example.com的权威域名服务器的地址。的域名,它首先是由浏览器发起一个DNS解析请求,如果本地缓存服务器中找不到结果,则首先会向根服务器查询,根服务器里面记录的都是各个顶级域所在的服务器的位置,当向根请求。

2025-02-27 20:47:05 887

原创 Java 双亲委派机制:深入理解类加载器的工作原理

双亲委派机制是 Java 类加载器的一种工作模式,其核心思想是:当一个类加载器需要加载某个类时,它首先会委托其父类加载器去加载,只有在父类加载器无法加载时,才会尝试自己加载。这种机制类似于“先问长辈,再自己动手”的逻辑,确保了类的加载过程是有序且安全的。双亲委派机制是 Java 类加载器的核心设计,它通过层次化的类加载器结构和委派机制,保证了类的唯一性、安全性和稳定性。理解双亲委派机制不仅有助于我们更好地掌握 Java 的类加载过程,还能帮助我们在实际开发中解决类加载相关的问题。

2025-02-26 21:16:00 731

原创 Java IO 流:从入门到实践

IO 流是 Java 中用于处理输入输出操作的抽象概念。它可以将数据从一个地方传输到另一个地方,例如从文件读取数据或将数据写入网络。IO 流的核心思想是流式处理,即数据像水流一样从一个地方流向另一个地方。Java IO 流是处理输入输出操作的重要工具。通过本文的介绍,你应该已经掌握了 IO 流的基本概念、分类以及常见用法。无论是文件操作、网络通信,还是对象序列化,IO 流都能帮助你高效地完成任务。

2025-02-25 00:13:11 622

原创 如何用JAVA实现布隆过滤器?

布隆过滤器是一种高效的概率数据结构,适用于需要快速判断元素是否存在的场景。本文通过 Java 实现了一个简单的布隆过滤器,并介绍了其原理和优化方法。希望这篇文章能帮助你理解布隆过滤器,并在实际项目中应用它!

2025-02-24 23:47:43 916

空空如也

空空如也

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

TA关注的人

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