- 博客(94)
- 收藏
- 关注
原创 Spring中bean的生命周期回调方法和执行顺序
1、对于普通的 Java 对象的生命周期是实例化、该对象不再被使用时通过垃圾回收机制进行回收实例化--->属性赋值---->初始化----->销毁一种是初始化回调,一种是销毁回调。合理的掌握bean在生命周期的初始化回调和销毁的函数,可帮助开发者编写更加健壮的程序。参考文章:1、Spring的核心模块原理介绍_spring 原理-CSDN博客2、Spring-Beans的生命周期的介绍_spring bean的生命周期-CSDN博客3、
2025-06-07 12:50:50
528
原创 Mysql中select查询语句的执行过程
MySQL 查询语句可以分为 Server 层和存储引擎层。而 Server 层包括连接器、查询缓存、解析器、预处理器、优化器、执行器等,
2025-06-06 14:23:48
598
原创 实现单例模式的常见方式
单例模式在基础设施组件(日志、配置、连接池等)中使用最为广泛,但在业务代码中应谨慎使用,以避免造成不必要的耦合。在Java中,枚举是实现单例模式的最佳实践,除非你需要延迟加载(枚举是类加载时就初始化),否则应该优先考虑使用枚举方式实现单例。
2025-06-05 20:55:49
781
原创 深入学习RabbitMQ队列的知识
AMQP)是一种高级消息队列协议,用于在分布式系统中实现异步通信和消息传递。它定义了消息的格式、传输规则和路由机制,允许不同系统、语言或平台之间通过统一的标准进行消息交互。
2025-06-05 14:18:01
1213
原创 那些Java 线程中断的实现方式
前言线程的调度和执行由操作系统决定,而 Java 通过提供一系列 API 来与操作系统交互,从而实现对线程的控制。因此Java 虚拟机(JVM)作为用户态程序,其实是无法直接终止一个线程的。当我们调用 thread.stop() 这类方法时,实际上是在用户态层面发出中断请求,而真正的线程终止还需要操作系统内核的配合。如下图所示::通过设置标志位,使线程正常退出,能够确保线程根据业务逻辑安全停止。:已废弃,不推荐使用,因为会导致线程安全问题和资源泄漏。
2025-06-04 11:21:59
677
原创 关于list集合排序的常见方法
前言Java中对于集合的排序操作,分别为,和的核心技巧。这是 Java 8 引入的最推荐的排序方式,语法简洁、可读性强。
2025-06-03 10:43:03
540
原创 Mysql的Memory引擎的深入了解
MySQL Memory引擎是一种完全基于内存的存储引擎,数据读写速度快但无持久性。其特点包括:仅支持哈希索引和表锁,适合等值查询但不支持事务和范围查询;重启后数据会丢失,主备架构可能出现不一致。与InnoDB相比,Memory引擎数据以无序数组存储,扫描时按插入顺序返回结果。适用于缓存、临时表等非持久化场景,使用时需注意内存限制和并发性能影响。生产环境中不建议作为主要数据存储,可搭配InnoDB引擎使用。
2025-05-30 14:36:56
954
原创 Conditional注解的使用
摘要:Spring框架中的@ConditionalOnBean和@ConditionalOnMissingBean注解用于实现条件化Bean创建。前者在容器存在指定Bean时创建当前Bean(如配置JdbcTemplate需要先有DataSource),后者在容器不存在指定Bean时创建(如提供默认DataSource)。两者结合可实现灵活配置(如RedisService自动装配和默认CacheService)。通过指定Bean名称或类型可实现更精确控制。这些注解是SpringBoot自动配置的核心,合理使
2025-05-30 11:44:30
769
原创 关于位图Bitmaps的介绍
Redis的Bitmaps是基于字符串实现的位级操作数据结构,每个bit表示二元状态(0/1),空间效率极高。核心命令包括SETBIT/GETBIT设置查询位值,BITCOUNT统计1的数量,BITOP进行位运算,BITPOS查找位位置。典型应用场景涵盖用户在线状态、签到系统、布隆过滤器等。虽然512MB上限能满足多数需求,但需注意大偏移量可能带来的内存消耗。通过位操作可高效处理大规模二元数据,但设计时需权衡业务需求和扩展性。
2025-05-30 10:04:44
1033
原创 深入探讨集合与数组转换方法
在 Java 中,list.toArray() 和 Arrays.asList() 是两个常见的集合与数组转换方法。 它们的行为和对原始数据的影响有显著区别,下面详细分析它们的机制及对数据修改的影响。示例代码1.4、注意事项 不能添加/删除元素:调用 add 或 remove 会抛出 UnsupportedOperationException。 结构修改限制:仅支持修改元素内容,不支持改变集合大小。示例:示例:2、数组copy可参考:小结:4.
2025-05-28 15:16:10
1390
原创 msql的乐观锁和幂等性问题解决方案
在分布式系统中,乐观锁幂等性设计和数据插入失败处理是保障数据一致性和系统可靠性的三大核心机制,它们共同协作以解决并发冲突、重复请求和网络异常等问题。1.乐观锁通过在数据库中添加version或timestamp字段,确保并发更新时的数据一致性。每次更新时检查版本号是否匹配。若匹配则更新并递增版本号,否则抛出异常(如适用于读多写少的场景,减少锁竞争,但需业务层配合处理冲突重试。2.幂等性设计确保同一请求多次执行的结果与一次执行相同,常用于支付、订单等关键业务。通过唯一业务标识符(如订单号)请求ID。
2025-05-27 14:30:55
1267
原创 操作系统的内核态和用户态场景
用户态和内核态是操作系统的两种运行状态。内核态:定义:操作系统内核运行的特权模式。特点可以执行所有CPU指令可以访问全部内存空间可以直接操作硬件设备权限最高,但风险也大处于内核态的 CPU 可以访问任意的数据,包括外围设备,比如网卡、硬盘等,处于内核态的 CPU 可以从一个程序切换到另外一个程序,并且占用 CPU 不会发生抢占情况,一般处于特权级 0 的状态我们称之为内核态。用户态:定义:应用程序运行的普通权限模式。特点只能访问受限的CPU指令集和内存空间不能直接访问硬件设备。
2025-05-24 13:47:45
959
原创 @Configuration 与 @Component 的区别
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller
2025-05-23 23:33:55
1080
原创 字符串和常量池的进一步研究
前言在 Java 中,String、StringBuffer 和 StringBuilder 都是 final是处理字符串的核心类。但它们的行为差异(如是否可变)与 final 的作用。final 的作用是限制类的继承,而类的可变性是由其内部设计决定的。如下图所示:⚠️注意:[][]
2025-05-23 20:07:40
955
原创 谈谈对dubbo的广播机制的理解
在Apache Dubbo中,广播调用(Broadcast)是一种特殊的调用模式,它将请求发送到所有注册的服务提供者(Provider),每个提供者都会独立执行该调用。这种模式常用于通知所有服务实例执行某些操作,如刷新缓存或更新配置。广播调用默认不支持自动重试,即使某个Provider调用失败,也不会自动重试。如果需要重试机制,可以在业务层封装重试逻辑,或使用@Reference的retries参数(不推荐)。广播调用适用于需要通知所有服务实例的场景,但需注意性能开销和幂等性要求。
2025-05-23 14:45:50
998
原创 Java 内存模型中的读、写屏障
处理器为了提高性能,会对指令进行重排序,这在单线程环境下不会有问题,但在多线程环境下可能导致数据不一致的问题。内存屏障通过禁止指令重排序,确保多线程环境下的操作有序进行。
2025-05-22 23:52:17
1267
原创 深入了解Springboot框架的启动流程
Springboot是依赖于spring的,除了拥有spring的全部功能以外,Springboot无需繁琐的xml配置(约定大于配置),有application.properties/yml配置文件,还有static静态配置目录,这取决于它自身强大的自动装配功能;并且自身已嵌入Tomcat、Jetty等web容器,集成了springmvc,使得springboot可以直接运行,不需要额外的容器。 依赖于强大的@EnableAutoConfiguration注解,通过SpringFactoriesLo
2025-05-22 11:59:45
842
原创 对于final、finally和finalize不一样的理解
finally 是异常处理机制的一部分,用于定义无论是否发生异常都需要执行的代码块。它通常与 try 和 catch 配合使用,确保资源释放或关键操作在程序流程中始终执行。try {// 可能抛出异常的代码// 异常处理逻辑// 无论是否发生异常,都会执行的代码。
2025-05-21 16:21:11
1011
原创 深入了解redis的哈希槽的知识
前言Redis 哈希槽(Hash Slot)是 Redis Cluster 实现分布式数据存储的核心机制之一。它是 Redis 集群用于(即槽位),并的策略。Redis Cluster 是 Redis 的分布式架构,它将数据分布在多个 Redis 实例(节点)上。为了实现数据分片,Redis Cluster 使用了哈希槽(Hash Slot)机制。Redis 集群将键空间划分为(编号从0到16383这个数能够平衡操作成本和系统性能。每个键通过CRC16算法计算哈希值,然后对16384。
2025-05-21 10:32:13
1429
原创 谈谈jvm的调优思路
调整JVM的堆内存可以帮助避免内存溢出,提高垃圾回收的效率。合适的垃圾回收器能够提高应用的响应速度和吞吐量。 在实际操作中,建议逐步调整参数,并结合性能监控工具来评估调优效果。
2025-05-20 22:50:37
1182
原创 谈谈mysql的日志的用途
MySQL 中的 binlog 和 redolog 是两种核心日志机制,它们在数据库的 数据持久化、主从复制 和 崩溃恢复 中扮演关键角色。undolog提供事务回滚日志记录。
2025-05-20 11:15:06
1094
原创 关于ReadWriteLock读写锁的介绍
通过合理选择锁策略,可以在高并发场景下平衡性能与公平性! 普通锁是排他锁(Exclusive Lock):无论读还是写,同一时刻只能有一个线程持有锁,性能较低。ReadWriteLock基于 AQS:通过 state 字段的高位和低位分别管理读锁和写锁。读锁与读锁不互斥。读锁与写锁互斥。写锁与写锁互斥。
2025-05-20 10:13:32
1323
原创 BeanFactory和FactoryBean的区别
IoC是Spring的核心思想,即对象的创建和依赖关系的管理由Spring容器(而非硬编码)完成。容器接管了对象生命周期的控制权。
2025-05-19 23:10:16
747
原创 关于IntegerCache.cache的介绍
127 在缓存范围内a和b都指向,因此a == b为true。128 超出缓存范围a和b会分别创建两个新对象,因此a == b为false。// 127 在缓存范围内// true(a 和 b 指向方法区的同一个对象)// 128 超出缓存范围// false(c 和 d 指向堆中的不同对象)小结小结。
2025-05-19 14:47:20
1150
原创 Java语言的设计原则
这些原则旨在提高代码的重用性、可读性、可扩展性和可靠性,实现高内聚、低耦合的程序设计。避免继承导致的类层级复杂、代码冗余和耦合度高。总结:代码设计原则的核心思想。(“不要和陌生人说话”)。
2025-05-19 13:26:37
772
原创 Spring-Beans的生命周期的介绍
本文详细介绍了Spring框架的核心组件及其功能,特别是容器层中的beans、context、core和expressionlanguage组件。重点讲解了Bean组件的定义、生命周期、执行时间和作用域。Bean的生命周期包括实例化、属性填充、初始化和销毁四个阶段,其中初始化阶段涉及Aware回调和初始化回调。Bean的作用域分为singleton、prototype、request和session,分别适用于不同的应用场景。此外,文章还提到了三级缓存在属性填充阶段的作用,并提供了代码示例来说明Bean的生
2025-05-18 21:55:55
909
2
原创 JVM如何处理多线程内存抢占问题
在多线程环境下,JVM通过多种机制高效、安全地管理内存分配,避免线程竞争导致的性能下降或数据不一致问题。主要机制包括:TLAB(Thread-Local Allocation Buffer),为每个线程提供私有内存缓冲区,减少全局堆内存的竞争;CAS(Compare-And-Swap)操作,确保全局堆内存分配的原子性;逃逸分析,将未逃逸对象分配在栈上,避免堆内存竞争;以及锁优化技术如偏向锁和自旋锁,减少线程阻塞。此外,JVM还通过堆内存结构(新生代和老年代)和内存分配方式(指针碰撞和空闲列表)来优化内存管理
2025-05-18 13:16:07
1179
原创 就ThreadLocal使用时OOM的讨论
本文探讨了ThreadLocal类的使用及其潜在的内存泄漏问题。ThreadLocal为每个线程提供独立的变量副本,但其存储机制和垃圾回收行为可能导致内存泄漏,特别是在线程池环境中。内存泄漏的主要原因包括ThreadLocalMap中Entry的key为弱引用而value为强引用,以及线程长期存活导致ThreadLocalMap无法被回收。
2025-05-18 12:02:15
1047
原创 ConcurrentSkipListMap的深入学习
ConcurrentSkipListMap 是 Java 中的一个并发集合类,实现了 ConcurrentNavigableMap 接口,基于跳表(SkipList)数据结构实现。其主要特点包括线程安全、有序性和高效性。它支持多线程并发访问,无需显式同步,确保数据一致性。通过跳表的多层级链表结构,查找、插入和删除操作的平均时间复杂度为 O(log n),适合高并发场景。ConcurrentSkipListMap 提供了丰富的 API,如导航方法、集合视图和范围查询,适用于需要频繁插入、删除和查找操作的多线程
2025-05-16 19:58:57
1114
原创 关于计算机系统和数据原子性的联系
本文探讨了计算机架构、基本数据类型及其原子性,以及Java中的多线程编程和原子操作。首先,32位和64位计算机架构在处理器架构、内存寻址能力、性能差异、软件兼容性、指令集和开发维护等方面存在显著差异。64位系统在处理大数据集和高精度计算方面具有优势,但开发复杂性较高。其次,Java中的基本数据类型(如int、long、double等)在内存中的字节占用和原子性方面有所不同,int等32位及以下类型通常具有原子性,而long和double在32位系统上可能不具备原子性。
2025-05-16 18:34:35
796
原创 Java对象的内存布局及GC回收年龄的研究
本文详细探讨了Java虚拟机(JVM)中对象的内存结构、垃圾回收(GC)机制以及对象晋升策略。首先,介绍了普通对象和数组对象的内存布局,包括对象头(MarkWord和ClassPointer)和实例数据的存储方式。接着,分析了GC在不同内存区域(新生代、老年代、元空间)的发生条件及对象晋升的规则,特别是通过15次MinorGC后对象从新生代晋升到老年代的设计。此外,文章还讨论了如何通过调整Survivor区大小或使用G1垃圾回收器来优化对象存活时间。最后,总结了JVM在设计GC年龄机制时如何在性能、内存效率
2025-05-15 19:19:38
1032
原创 ConcurrentHashMap的size方法线程安全问题探讨
ConcurrentHashMap 是 Java 中一个高效的线程安全哈希表实现,专为高并发设计。它通过分段锁(Java 7)和 CAS+synchronized 的无锁化设计(Java 8)来优化并发控制,减少锁竞争,提升性能。Java 8 引入了批量操作的并行化设计,支持并行任务分割、弱一致性迭代和并行执行框架,进一步提高了处理效率。ConcurrentHashMap 的 size() 方法返回的是近似值,适合了解大致大小,但不适合精确操作。其应用场景包括数据统计、批量处理和事件驱动等,成为高并发系统中
2025-05-15 14:19:52
675
原创 关于多线程的Redis模型
Redis 6.0引入了多线程模型,主要在网络I/O处理阶段提升性能,而核心命令执行仍由单线程处理,确保数据一致性和线程安全。多线程模型通过非阻塞I/O和事件驱动机制,显著提高了高并发场景下的吞吐量,特别是在处理大量短小请求时表现优异。用户可以通过配置io-threads参数来调整I/O线程数量,以匹配工作负载。这种设计在保持Redis简洁性的同时,优化了网络I/O性能,适用于实时数据处理和高并发应用场景。
2025-05-15 12:03:20
1157
原创 关于并发编程AQS的学习
AQS(AbstractQueuedSynchronizer)是Java并发编程中的核心同步器框架,由Doug Lea设计,位于java.util.concurrent.locks包下。它是构建锁(如ReentrantLock)和其他同步工具(如CountDownLatch、Semaphore)的基础抽象类。AQS通过抽象方法(如tryAcquire、tryRelease)定义同步器的核心逻辑,开发者只需实现这些方法即可自定义锁或同步组件。AQS内部通过CLH队列管理线程的阻塞和唤醒,支持独占和共享模式。其
2025-05-14 22:19:42
1130
原创 MQ消息队列的深入研究
前言消息队列(Message Queue,简称 MQ)是一种用于在分布式系统中实现异步通信的技术。它提供了一个可靠的机制,可以在应用程序或服务之间传递消息,以提高系统的如下图所示:Apache Kafka、RabbitMQ、RocketMQ 和 ActiveMQ 是流行的消息队列解决方案,它们在架构设计、性能、特性和适用场景上各有不同。
2025-05-14 14:37:35
1127
原创 分布式事务的处理思路
在分布式系统中,分布式事务确保多个独立服务或数据库操作要么全部成功,要么全部失败,以维护系统一致性。处理分布式事务的复杂性主要源于网络延迟、节点故障和服务异步等因素。事务具有ACID特性:原子性、一致性、隔离性和持久性。常见的隔离级别包括读未提交、读已提交、可重复读和串行化。分布式事务协议主要有2PC和3PC,分别通过准备和提交阶段来协调事务。Seata框架提供了AT、TCC、Saga和XA四种分布式事务解决方案,适用于不同场景。AT模式对业务无侵入,TCC模式需实现Try、Confirm和Cancel操作
2025-05-14 10:49:39
697
原创 深入学习Zookeeper的知识体系
Zookeeper是一个开源的分布式协调服务框架,由Apache基金会维护,主要用于管理大规模分布式系统中的配置数据、命名、同步和提供组服务等。其设计目的是简化分布式应用的开发,确保跨多个服务器或节点中共享数据的一致性和可靠性。Zookeeper基于CAP理论和BASE理论,强调在可用性、一致性和分区容忍性之间的权衡。Zookeeper使用ZAB(ZooKeeper Atomic Broadcast)协议来保证数据一致性,支持崩溃恢复和消息广播两种模式。Zookeeper的集群由Leader、Followe
2025-05-13 15:36:13
1163
原创 深入探讨dubbo组件的实践
随着系统服务数量的增加,服务间的依赖关系变得复杂,Dubbo作为一个高性能、轻量级的Java RPC框架,提供了高效的远程服务调用和SOA服务治理方案。Dubbo通过分层架构设计,包括服务层、配置层、代理层、注册中心层、集群容错层、监控层、远程调用层、信息交换层、网络传输层和数据序列化层,各层之间松耦合,增强了系统的可扩展性和灵活性。Dubbo支持多种负载均衡和容错策略,如随机、轮询、最少活跃调用等,以及失败自动切换、快速失败等容错机制。
2025-05-12 22:51:25
874
原创 HashMap中哈希值与数组坐标的关联
本文详细介绍了HashMap中哈希值的生成与处理、桶的索引计算以及哈希冲突的解决方案。首先,通过调用hashCode()方法生成32位整数哈希码,并对其进行处理以确保更均匀的分布。接着,使用h & (n-1)技巧高效计算桶的索引,其中n为2的幂,以优化位操作。哈希冲突的解决主要采用拉链法和开放寻址法。拉链法通过链表存储冲突的键值对,而开放寻址法则在数组中寻找下一个可用位置。这些方法确保了HashMap在O(1)平均时间复杂度下快速访问元素,同时减少性能损失。
2025-05-12 15:55:57
641
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人