自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 深度解析JVM类加载器与双亲委派模型

Java虚拟机(JVM)是Java程序运行的核心,其中类加载器和双亲委派模型是JVM的重要组成部分。本文将深入讨论这两个概念,并解释它们在实际开发中的应用。类加载器是JVM的一部分,负责加载Java类的字节码文件。Java应用程序中的每个类都必须由类加载器加载,类加载器将类的字节码文件从磁盘或网络加载到内存中,并在JVM中创建一个对应的Class对象。双亲委派模型是一种类加载器之间的层次结构,它通过父类加载器委派给子类加载器加载类。

2024-01-13 20:57:54 2147

原创 深入了解Java多线程编程:JVM内存模型与同步机制

多线程编程是当今软件开发中不可避免的话题之一。在Java中,了解JVM内存模型及相关概念对编写正确、高效的多线程代码至关重要。本文将深入探讨JVM内存模型、重排序、内存屏障、happen-before关系、主内存、工作内存以及同步机制,并通过具体案例进行原理分析。

2024-01-13 20:11:00 455 2

原创 经典问题 | 线程打印ABA问题

线程A, B,C三个线程, 当存在竞争的时候, 第一个元素应该打印A, 这个时候打印B的线程进来了, 为了要保证打印ABC是顺序执行的,因此不能让打印B的线程打印.在这个问题中,我们有三个线程,每个线程负责打印一个字符。因此线程携带的字母减去'A'构成了条件, 与计数器对3取模的数值进行比较, 就知道当前线程是否可以打印字母.使用一个共享的计数器, 默认从0开始, 每打印一个元素, 次数+1, 严格按照0,1,2顺序打印ABC。条件2 : 在条件1的基础上, 判断线程携带的元素是否是需要打印的元素即可.

2024-01-09 15:01:59 360

原创 二叉树 | 二叉树的对称问题

二叉树的镜像对称问题

2024-01-09 13:55:53 388

原创 链表 | 指针法解决链表反转问题

指针法解决链表反转的问题

2024-01-09 13:37:05 921

原创 二叉树 | 二叉树的前序遍历问题

通过递归思想完成二叉树的前序遍历.

2024-01-08 21:22:11 439

原创 jvm | 垃圾回收机制

垃圾回收算法的演进包括标记和清除两个主要阶段。初始阶段采用标记清除算法,通过标记存活对象,再清除未标记的垃圾对象。为了解决标记清除算法的空间碎片问题,引入了标记整理算法,它在标记的基础上将存活对象整理到内存的一端,减少碎片。复制清除算法则将内存划分为两个区域,通过复制存活对象至一块区域,再清除未复制的区域,解决了碎片问题。

2024-01-05 18:05:46 1583 1

原创 jvm虚拟机栈:Java程序的执行框架

虚拟机栈是每个线程私有的内存区域,用于存储方法的执行信息。每个方法在执行的同时都会创建一个栈帧(Stack Frame),栈帧包含了方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。

2024-01-05 15:18:35 1151

原创 如何确保分布式环境下消息的顺序消费

在消息队列中保障消息的顺序性通常涉及将相同业务标识的消息发送到同一个队列,并确保消费者按照一定的顺序从队列中拉取并处理消息。通过一定的哈希计算策略, 以确保业务标识相同的消息被发送到同一个主题或队列, 比如同一个订单的创建, 支付, 完成这三个消息一定要在一个队列中。消费者按照顺序从队列中拉取消息。由于相同业务标识的消息被发送到同一个队列,保证了它们在队列中的有序性。

2024-01-04 18:32:11 1516

原创 链表 | 链表中环的入口结点

如下图所示, 两段链表{1,2}, {3,4,5}, 头结点是1, 环节点是3, {3,4,5}成环.给一个长度为n链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null.我们的目标就是在给定的一个链表中找出环节点.

2024-01-04 14:52:13 818

原创 Jvm内存为什么要分成新生代、老年代、持久代 | 新生代中为什么要分为Eden和Survivor

JVM内存的划分及参数配置在垃圾回收效率和内存利用率之间找到了平衡点。通过新生代的划分和两个 Survivor 区的设计,JVM能够更有效地管理内存,提高垃圾回收的效率。调整参数可以根据应用的特性来灵活配置,以优化性能。这种划分和配置的方式使得JVM能够更好地适应不同类型的对象行为,从而提供更好的应用性能。

2024-01-03 21:42:55 712

原创 jvm面试题: 什么情况下会发生栈内存溢出

栈是线程私有的,其生命周期与线程相同。每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。如果线程请求的栈深度大于虚拟机所允许的最大深度,就会抛出。栈内存溢出是由于栈空间不足以满足线程的请求,主要涉及到局部变量表、操作数栈、动态链接、方法出口等信息的存储。如果方法内部声明了大量的局部变量,也可能导致栈内存溢出。通过采取这些解决方案,我们可以有效地预防和处理栈内存溢出的问题,提高程序的稳定性和性能。如果代码中存在递归调用,可以考虑优化递归算法,减少递归深度。

2024-01-03 17:50:44 434

原创 jvm虚拟机初识

Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。Java 程序的最终执行是通过执行引擎执行字节码指令,从而按照程序的逻辑改变程序状态,包括对栈、堆和方法区的操作。整个过程中,涉及到了类加载、字节码验证、执行引擎执行、本地方法调用等多个组成部分。本地方法库是由本地语言(如 C 或 C++)编写的库,其中包含与 Java 代码进行交互的本地方法的实现。本地方法接口负责将 Java 数据类型转换为本地方法支持的数据类型,并调用本地方法库中的函数。

2024-01-03 15:57:48 663

原创 SpringFrameWork之InitializingBean

接口的主要作用是在 bean 实例化之后、属性设置之后,执行一些自定义的初始化逻辑。这样,我们可以确保在 bean 使用之前,其依赖和状态都已经初始化完毕。接口提供了一种灵活的方式,允许开发者在 bean 初始化阶段执行自定义逻辑。进行初始化,因为它们更具有可读性,且不依赖于 Spring 特定的接口。是 Spring 提供的一种初始化 bean 的方式,但通常更推荐使用。当 Spring 容器实例化一个 bean 后,会检查它是否实现了。接口,就必须提供对应的实现方法。接口的作用和实现原理。

2023-12-22 15:33:19 40

原创 dynacmic-tp动态线程池

基于上一个问题, 修改生产环境能修改线程池参数最合适的地方就是配置中心了. 那如何保障能够适配不同类型的配置中心呢?为了更好地管理和监控线程池的运行状况,我们需要一种动态的监控机制,以适应不同框架和应用场景。大家都知道线程池7大参数, 在构建线程池的时候, 怎么确保你设定的参数到了生产一定不会有问题呢?这里, 我们先提出以下一些问题, 这是我想学习dynamic-tp动态线程池的动力.监控线上的线程池情况, 通知如何接入, 比如接入钉钉, 企业, 微信的通知?配置中心配置线程池实例。

2023-12-22 15:10:44 397

原创 双指针 | 移动零

输入:nums = [0, 1, 0, 3, 12]移动到数组的末尾,同时保持非零元素的相对顺序。输出:[1, 3, 12, 0, 0],编写一个函数将所有。

2023-12-18 11:00:20 128

原创 线程基本使用 | 线程池原理 | 线程生命周期 | 守护线程 讲解

作用AbstractExecutorService 是一个抽象类,实现了 ExecutorService 接口的一部分方法,为自定义线程池提供了一些通用的实现。它位于线程池框架的设计中,为实现自定义的线程池提供了一些基本的模板方法,简化了自定义线程池的操作。这个抽象类提供了一些基本的实现,例如任务提交、任务列表管理、Future 对象的创建等,但对于实际的任务执行逻辑,它仍然依赖于具体的实现类去完成。

2023-12-15 15:18:45 748

原创 HashMap | TwoSums之和

解释:nums[0] + nums[1] = 2 + 7 = 9,因此返回 [0, 1]。在遍历过程中,检查当前数字与目标值之差是否已经在哈希表中,如果是则找到答案。输入:nums = [2, 7, 11, 15], target = 9。,请你在该数组中找出和为目标值的两个整数,并返回它们的数组下标。使用哈希表(HashMap)存储数字及其索引。使用哈希表记录已经遍历过的数字及其索引。

2023-12-15 10:46:06 28

原创 深入理解synchronized关键字| java锁机制

首先,偏向锁适用于短时间内只有一个线程访问的情况,通过偏向锁提供低开销的锁机制。当有其他线程竞争同一锁时,系统可能升级为轻量级锁,此时线程会通过自旋等待锁的释放,避免阻塞线程带来的性能开销。当一个线程第一次获得锁时,会在对象头和栈帧中的锁记录中存储锁偏向的线程ID。本文将深入介绍Java中的锁机制,包括基本的synchronized用法以及在Java SE 1.6中引入的偏向锁和轻量级锁的优化机制。如果成功,线程直接获得锁;在没有竞争的情况下,持有锁的线程再次进入同步块时,无需竞争锁,直接获取。

2023-12-06 15:36:26 959

原创 多线程如何保证线程安全性

如何保证线程安全性.

2023-12-04 21:27:01 151

原创 RabbitMq基础架构概念

在 RabbitMQ 中,消息传递的机制涉及多个关键组件。生产者通过连接(Connection)与 RabbitMQ Broker 建立通信,然后创建通信通道(Channel)。Exchange 接收生产者发送的消息,并通过路由规则将消息发送到一个或多个队列。队列是消息的缓冲区,等待被消费者接收。消费者通过连接创建通道,订阅队列以接收消息。Virtual Host 提供了逻辑隔离,允许在同一 RabbitMQ Broker 上运行多个应用程序,每个应用程序都有自己的独立配置和权限。这些组件共同构建了一个灵活

2023-12-04 18:06:19 45

原创 rabbitmq | rabbitTemplate的convertAndSend部分源码解析

在RabbitMQ中,事务是一种确保消息发送的可靠性的机制。Spring AMQP提供了对RabbitMQ事务的抽象,而作为Spring AMQP的核心组件,提供了许多简化消息发送的方法。在这篇博客中,我们将深入探讨RabbitMQ事务机制的源码实现,以及Spring封装的的使用。

2023-12-01 20:56:23 1291

原创 redis部分原理数据结构详解

键值存储 | 内存数据库 | 支持多种数据结构(字符串、列表、集合、有序集合、哈希表)| 高性能发布/订阅模式 | 事务支持 | 分布式缓存 | 实时分析和计数。

2023-10-07 14:47:46 50

原创 最佳实践: 构建事件驱动消息队列(可支持延时队列)

事件驱动的延时队列是一种常见的设计模式,用于在系统中处理延迟触发的任务或事件。以下是一个实现事件发布实现消息推送可支持延时队列的实践,包括主要组件和步骤。

2023-09-21 19:44:14 66

空空如也

空空如也

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

TA关注的人

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