自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 前端性能优化

本文介绍了前端性能优化的关键技术:路由懒加载通过动态导入分离模块,配合webpackChunkName实现按需加载;组件懒加载使用defineAsyncComponent和Suspense延迟加载非首屏组件;图片优化包括懒加载、动态裁剪、base64转换和字体图标;防抖节流技术用于控制高频事件触发频率。这些方法能有效减少首屏加载时间,优化资源加载策略,提升用户体验。核心思想是"按需加载"和"延迟执行",通过代码分割、资源控制等技术手段平衡性能与功能。

2026-01-28 22:00:47 614

原创 计算机基础

计算机基础

2026-01-27 18:05:23 610

原创 Spring全家桶

Spring全家桶

2026-01-26 21:23:53 718

原创 MQ消息队列

MQ消息队列

2026-01-26 20:38:50 349

原创 redis

redis

2026-01-26 20:37:37 558

原创 MySQL

MySQL

2026-01-26 20:35:03 769

原创 JUC并发编程

JUC并发编程

2026-01-26 20:33:29 486

原创 JVM虚拟机

JVM虚拟机

2026-01-26 20:29:41 785

原创 java集合

java集合

2026-01-26 20:19:08 603

原创 javaSE

javaSE

2026-01-26 20:14:21 595

原创 Sharding Sphere

摘要:本文介绍了ShardingSphere分库分表技术,主要包括垂直拆分(按列/业务模块分为垂直分库和垂直分表)和水平拆分(按行分为水平分库和水平分表)。垂直拆分适用于业务模块分离和性能优化,水平拆分则解决大数据量和高并发问题。文中详细展示了ShardingSphere-JDBC的Maven依赖配置,并比较了JDBC与Proxy模式的区别,强调JDBC作为嵌入式驱动适合Java应用,具有更低延迟和更高性能。最后提供了SQL示例说明如何实现各类分库分表策略。

2026-01-19 20:14:54 656

原创 redolog、undolog、binlog

MySQL采用Server层和引擎层两层架构,三大日志系统分工明确:undo log记录事务前状态用于回滚和MVCC,redo log记录事务后状态用于崩溃恢复和性能提升,bin log记录所有变更用于主从复制和数据恢复。写入流程采用两阶段提交保证一致性。redo log与bin log的区别在于:redo log是引擎层物理日志、循环写入,具备崩溃恢复能力;bin log是Server层逻辑日志、追加写入,用于全量记录。这种设计确保了数据安全性和系统高效性。

2026-01-19 12:18:15 605

原创 分布式事务seata

分布式事务解决方案 本文系统介绍了分布式事务的理论基础与Seata框架的配置实现。首先阐述了本地事务ACID原则与分布式事务的差异,指出跨服务、跨数据库操作带来的挑战。然后深入讲解CAP定理的核心矛盾(一致性、可用性、分区容错不可兼得)和BASE理论的折中方案(基本可用、软状态、最终一致性)。 文章重点演示了Seata Server与Nacos的集成配置过程,包括注册中心、配置中心的设置,以及MySQL数据库的初始化。同时指导了客户端如何通过bootstrap.properties接入Seata服务。这些配

2025-12-31 18:45:43 919

原创 JUC-CopyOnWrite 类集合

CopyOnWrite是Java并发包中的线程安全集合实现,包括CopyOnWriteArrayList和CopyOnWriteArraySet。核心原理是写入时拷贝:写操作加锁并创建新数组,不影响并发的读操作。它采用读写分离策略,适合读多写少场景,但存在弱一致性问题,可能出现读取到旧数据的情况。示例代码展示了它们的基本用法和并发读写特性。相比单线程集合,这些并发集合提供了线程安全保障,但需要权衡性能与一致性的关系。

2025-09-15 15:13:24 396

原创 JUC-BlockingQueue 类集合

阻塞队列概述与应用 阻塞队列是Java并发包中的一种线程安全队列,支持阻塞式插入和获取操作,常用于生产者-消费者模式。主要实现包括: ArrayBlockingQueue:基于数组的有界队列,容量固定 LinkedBlockingQueue:基于链表,可指定容量或无界 PriorityBlockingQueue:支持优先级的无界队列 DelayQueue:延迟队列,元素到期才能获取 SynchronousQueue:不存储元素,直接传递数据 LinkedTransferQueue:支持直接传递的无界队列 L

2025-09-15 15:12:46 1092

原创 JUC-Concurrent类集合-ConcurrentLinkedQueue

ConcurrentLinkedQueue和ConcurrentLinkedDeque是Java中的无界线程安全队列实现,采用非阻塞算法和CAS操作实现高并发性能。ConcurrentLinkedQueue是FIFO队列,提供offer/poll/peek等方法;ConcurrentLinkedDeque支持双端操作,具备offerFirst/offerLast等特性。两者均基于链表结构,适合高并发场景如生产者-消费者模式、实时数据处理等。文中还给出了使用示例和一个简化版的ConcurrentLinkedQ

2025-09-15 15:10:20 516

原创 JUC-Concurrent类集合-ConcurrentSkipListMap

ConcurrentSkipListMap是Java并发包中的线程安全有序映射,基于跳表数据结构实现。它具有O(log n)时间复杂度的读写操作,支持高效并发访问和范围查询。核心特点包括:读操作无锁,写操作采用CAS和细粒度锁;适用于需要有序存储的高并发场景如排行榜。与ConcurrentHashMap相比,它牺牲部分性能(O(1)→O(log n))换取有序性。典型应用包括时间序列存储和优先级队列。开发者应根据有序性需求在ConcurrentSkipListMap和ConcurrentHashMap间选择

2025-09-15 15:09:39 470

原创 JUC-Concurrent类集合-ConcurrentHashMap

本文分析了JDK 1.8中ConcurrentHashMap的核心实现。主要内容包括: 容器初始化:ConcurrentHashMap有5种构造方法,初始化采用懒加载模式,在第一次添加元素时才真正初始化数组。sizeCtl变量用于控制初始化和扩容,其值不同代表不同状态。 添加元素: 使用CAS+自旋保证线程安全 对空桶直接CAS插入 遇到扩容中的桶会协助扩容 非空桶使用synchronized加锁后处理 链表转红黑树的阈值为8 关键设计: 采用分段锁思想提高并发度 通过sizeCtl变量实现多线程协同扩容

2025-09-15 10:43:16 1077

原创 JUC-同步器

AQS(AbstractQueuedSynchronizer)是Java并发包中实现锁和同步器的核心框架。它通过维护一个volatile的state状态和CLH队列来管理线程的阻塞与唤醒。AQS支持独占模式(如ReentrantLock)和共享模式(如Semaphore),子类通过重写tryAcquire、tryRelease等方法实现特定同步逻辑。AQS采用模板方法设计模式,提供了获取锁、释放锁的标准流程,同时使用park/unpark机制实现线程阻塞与恢复。其内部通过双向链表实现同步队列,单向链表实现条

2025-09-15 10:32:54 787

原创 JUC-线程池

线程池是一种复用线程资源的技术,通过预先创建一定数量的线程并重复使用,避免频繁创建和销毁线程带来的性能开销。其核心作用包括降低资源消耗、提高响应速度及增强线程管理性。文章通过自定义线程池实现,展示了任务队列、工作线程、拒绝策略等关键组件。拒绝策略支持多种处理方式(如阻塞等待、超时放弃、调用者执行等),任务队列采用阻塞机制实现生产-消费模型。线程池通过复用Worker线程处理任务队列中的任务,超出核心线程数时根据策略处理新任务,有效提升系统性能和稳定性。

2025-09-15 10:11:22 975

原创 JUC-无锁

本文介绍了CAS(Compare-And-Swap)原理及其在Java中的应用。CAS是一种无锁编程技术,通过CPU指令实现原子操作,具有线程安全、无阻塞并发等特点。其核心思想是乐观锁,通过比较内存值与期望值来决定是否更新数据。Java中的原子类(如AtomicInteger)基于CAS实现,提供了getAndSet、incrementAndGet等原子操作方法。文章还分析了CAS的底层实现(lock cmpxchg指令)及其优缺点,包括ABA问题、只能保证单一变量原子性等限制。此外,介绍了原子引用(Ato

2025-09-15 10:08:13 840

原创 JUC-内存

Java内存模型(JMM)定义了线程与内存之间的交互规则,确保多线程程序在不同平台上的内存访问一致性。JMM抽象出主内存和工作内存概念,线程通过8种原子操作实现数据同步。JMM三大特性包括可见性(保证线程能及时感知共享变量修改)、原子性(确保指令执行的完整性)和有序性(防止指令重排序导致逻辑错误)。CPU多级缓存机制通过空间和时间局部性提升性能,但缓存行可能导致伪共享问题,即一个核心修改数据会使其他核心的整个缓存行失效。理解JMM和缓存机制对编写高效并发程序至关重要。

2025-09-15 09:56:44 1043

原创 JUC-同步

摘要 本文主要介绍了Java多线程编程中的临界区、线程安全问题及解决方案。临界区指访问临界资源的代码块,多个线程同时访问可能导致竞态条件。解决线程安全问题的方法包括阻塞式(synchronized、lock)和非阻塞式(原子变量)。synchronized通过对象锁保证临界区代码的原子性,实现互斥和同步。文章详细讲解了synchronized的使用方法(同步块和同步方法)、锁原理、多把锁应用以及死锁的形成条件和避免策略。此外还介绍了活跃性问题如死锁的检测与解决,为Java多线程编程提供了实用指导。

2025-09-12 18:25:34 1023

原创 JUC-进程&线程

摘要 本文介绍了进程与线程的基本概念及其对比。进程具有并发性、动态性等特征,而线程是进程中的执行单元,共享进程资源但独立调度。一个进程可包含多个线程实现并发执行。线程相比进程更轻量,通信更简单,但进程间通信较为复杂,涉及信号量、共享存储、管道等方式。文章还详细阐述了Java中创建线程的三种方法:继承Thread类、实现Runnable接口和使用Callable接口,分析了各自的优缺点,并介绍了Thread类的常用API方法。

2025-09-12 16:29:28 621

原创 mysql的各种锁

本文系统介绍了MySQL中的三种锁机制:全局锁、表级锁和行级锁。全局锁锁定整个数据库实例,主要用于数据备份;表级锁分为表锁、元数据锁和意向锁,其中意向锁通过"挂牌告知"机制解决行锁与表锁的冲突问题;行级锁包括记录锁、间隙锁和临键锁,详细分析了不同查询条件下的加锁规则,特别解释了唯一索引等值查询和范围查询时的锁退化机制。文章还通过具体SQL示例演示了各种锁的应用场景和工作原理,帮助理解MySQL锁机制在并发控制中的重要作用。

2025-09-11 19:20:48 926

原创 MVCC讲解

本文介绍了MySQL中的当前读和快照读机制。当前读会锁定记录(如update/delete/select for update操作),保证读取最新数据;快照读则基于MVCC机制读取历史快照(普通select操作),提高并发性能。通过版本链(undo日志)和ReadView实现事务隔离:READ COMMITTED每次查询生成新ReadView,读取已提交的最新数据;REPEATABLE READ首次查询生成ReadView后保持不变,保证事务内读取一致性。文章详细说明了版本链形成过程及不同隔离级别下Read

2025-09-11 19:18:19 1155

原创 mysql事务

MySQL事务是数据库逻辑处理单元,具有ACID特性:原子性(undo log实现)、一致性、隔离性(默认REPEATABLE READ级别)和持久性(redo log实现)。事务隔离级别包括:READ UNCOMMITTED(可能脏读)、READ COMMITTED(不可重复读)、REPEATABLE READ(避免不可重复读)、SERIALIZABLE(完全隔离)。不同级别在并发控制与性能间做出权衡,MySQL通过undo log和redo log机制确保事务的原子性和持久性,MVCC实现多版本并发控制

2025-09-11 19:13:58 1427

原创 索引失效&索引设计

索引失效常见场景包括:1)联合索引不符合最左原则;2)索引字段类型转换;3)LIKE以%开头;4)数据量小优化器选择全表扫描;5)对索引列使用函数或运算;6)OR连接非索引列。设计索引的黄金法则:1)为WHERE条件和ORDER BY字段创建索引;2)注意复合索引顺序(筛选性强的在前);3)使用覆盖索引减少回表操作。合理设计索引可显著提升查询性能,避免全表扫描。

2025-09-11 19:11:51 481

原创 联合索引&最左前缀原则&索引下推

本文介绍了MySQL中的联合索引、最左前缀原则和索引下推技术。联合索引是辅助索引的一种,按照字段顺序排序存储数据,支持多字段查询优化。最左前缀原则指出只有查询联合索引最左N个字段时才能利用该索引。对于联合索引设计,应优先考虑减少索引数量并合理分配字段顺序。索引下推是MySQL5.6引入的优化技术,在索引遍历时提前过滤不符合条件的记录,减少回表操作次数,提升查询效率。这些技术相互配合,共同提升数据库查询性能。

2025-09-11 19:09:51 1051

原创 覆盖索引优化回表查询

回表查询是指当使用非聚集索引(辅助索引)查询时,需要先通过辅助索引找到主键值,再通过主键到聚集索引中查找完整行记录的过程,这会降低查询性能。覆盖索引是一种优化手段,通过创建包含查询所需所有字段的联合索引,避免回表操作,只需扫描一次索引树即可获取结果。常见应用场景包括:优化列查询、全表count查询和分页查询。例如,将单列索引升级为联合索引,或为分页查询创建包含排序字段的联合索引,都能显著提升查询效率。

2025-09-11 19:05:44 1162

原创 深入学习并发编程中的volatile

volatile关键字在Java并发编程中主要有两个作用:保证内存可见性和禁止指令重排序。它通过强制线程从主内存读取最新值,并在修改后立即写回主内存,确保多线程环境下的变量可见性。此外,volatile修饰的变量会插入内存屏障,防止编译器和处理器对其进行指令重排序优化。相比synchronized锁,volatile更轻量但无法保证原子性,适用于单一写多读的场景,但过度使用可能导致总线风暴问题。

2025-09-04 16:38:36 893

原创 深入学习并发编程中的synchronized

本文介绍了并发编程中的三个核心问题:可见性、原子性和有序性,并探讨了Java内存模型(JMM)的概念。 可见性问题:当一个线程修改共享变量时,其他线程可能无法立即看到最新值。通过示例展示了即使一个线程修改了标志变量,另一个线程仍可能继续循环的情况。 原子性问题:多线程操作共享变量时可能被中断,导致操作不完整。通过5个线程各执行1000次i++的示例,说明number++操作不是原子性的。 有序性问题:编译器和运行时优化可能导致代码执行顺序与编写顺序不一致。使用jcstress工具演示了指令重排可能导致的意外

2025-09-02 08:47:03 1055

原创 线程六种状态的转换

线程生命周期包含六种状态:New(新建)、Runnable(可运行)、Blocked(阻塞)、Waiting(等待)、Timed Waiting(计时等待)和Terminated(终止)。新建线程处于New状态,调用start()后进入Runnable状态。Runnable状态可能正在执行或等待CPU调度。当线程获取锁失败时进入Blocked状态;调用wait()或join()会进入Waiting状态;带超时参数的等待方法会进入Timed Waiting状态。线程终止可能因正常执行完成或异常中断。状态转换是

2025-09-01 17:15:47 804

原创 单例模式(Singleton Pattern)

单例模式是保证一个类仅有一个实例的设计模式,主要用于全局信息类和无状态工具类场景。实现方式分为饿汉式(对象预先创建)和懒汉式(使用时创建)。饿汉式包括静态常量和静态代码块两种线程安全写法。懒汉式有四种实现:线程不安全的基础版、同步方法版(性能差)、双重检查版(线程不安全)以及推荐使用的volatile双重检查模式(保证线程安全与可见性)。此外,静态内部类方式利用JVM类加载机制实现延迟加载和线程安全,而枚举方式则天然防止反射和反序列化破坏单例,是最简洁安全的实现方案。

2025-09-01 17:08:16 855

原创 HashMap集合(高级)

本文摘要: HashMap是Java中基于哈希表的Map实现,采用键值对存储方式,允许null键值但键唯一。JDK1.8前使用数组+链表结构,1.8后引入红黑树优化性能,当链表长度>8且数组长度>64时转为红黑树存储。其核心特性包括:无序存储、非线程安全、动态扩容(默认2倍)等。底层通过扰动函数计算哈希值,采用拉链法解决哈希冲突。文章详细剖析了put/get方法的执行流程,包括初始化、哈希计算、冲突处理、树化条件等关键机制,并解答了常见面试问题,如哈希碰撞处理、红黑树引入原因等,是深入理解Has

2025-09-01 16:59:32 548

原创 Map接口

Map集合概述interface Map<K,V> K:键的类型;V:值的类型Map集合的特点双列集合,一个键对应一个值键不可以重复,值可以重复Map集合的基本使用//创建集合对象//V put(K key, V value) 将指定的值与该映射中的指定键相关联map.put("itheima001","林青霞");map.put("itheima002","张曼玉");map.put("itheima003","王祖贤");map.put("itheima003","柳岩");

2025-09-01 16:48:05 756

原创 Queue接口

本文介绍了Java中的Queue接口及其实现类。Queue是FIFO队列,Deque是其子接口的双向队列。Queue提供了add/offer、remove/poll、element/peek三组方法,其中带"offer/poll/peek"的方法更安全。主要实现类有:1)LinkedList基于链表,支持队列和双端队列;2)ArrayDeque基于动态数组,性能更高;3)PriorityQueue基于优先堆实现优先级队列。三者均非线程安全,其中ArrayDeque和PriorityQue

2025-09-01 16:43:52 346

原创 Set接口

本文介绍了Java中Set集合和TreeSet集合的基本用法和特性。Set集合不存储重复元素且无索引,不能使用普通for循环遍历。TreeSet基于红黑树实现,能自动排序且保证元素唯一性,支持自然排序(实现Comparable接口)和比较器排序(通过Comparator)。文章通过代码示例演示了如何存储字符串、整数以及自定义对象(学生和教师类),并实现按年龄和姓名排序的功能。

2025-09-01 16:40:39 899

原创 ArrayList源码解析

摘要: ArrayList基于动态数组实现,核心字段包括存储数组elementData和元素数量size。添加元素时,若容量不足会触发1.5倍扩容(均摊O(1)),指定位置插入需移动元素(O(n))。删除元素同样需要移动数据(O(n)),但随机访问效率高(O(1))。迭代器采用快速失败机制,检测并发修改。ArrayList非线程安全,多线程场景可使用Collections.synchronizedList或CopyOnWriteArrayList。其优势是随机访问,但插入/删除效率较低,适合查询频繁的场景。

2025-09-01 16:35:47 445

原创 LinkedList源码解析

本文分析了Java中LinkedList的核心实现与设计要点。其底层采用双向链表结构,每个节点存储前驱和后继指针,支持高效的头尾操作(O(1)时间复杂度),但随机访问需遍历(O(n))。相比ArrayList,LinkedList在插入删除操作上更优,但内存占用更高且缓存不友好。文章详细介绍了添加、删除元素的具体实现,迭代器设计以及线程安全问题,并通过对比表格总结了两种数据结构的适用场景:LinkedList适合频繁插入删除,而ArrayList更适合随机访问和内存敏感场景。

2025-09-01 16:29:49 371

空空如也

空空如也

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

TA关注的人

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