自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 转转面试官:ArrayList 为什么不是线程安全的,具体来说是哪里不安全?

部分值为null:当线程1走到了扩容那里发现当前size是9,而数组容量是10,所以不用扩容,这时候cpu让出执行权,线程2也进来了,发现size是9,而数组容量是10,所以不用扩容,这时候线程1继续执行,将数组下标索引为9的位置set值了,还没有来得及执行size++,这时候线程2也来执行了,又把数组下标索引为9的位置set了一遍,这时候两个先后进行size++,导致下标索引10的地方就为null了。将数组的size位置设置值(因为数组的下标是从0开始的);size与我们add的数量不符。

2025-02-05 18:20:51 298

原创 转转面试官:spring在什么情况下没有解决循环依赖问题

面试官问的是Spring在什么情况下没有解决循环依赖问题。首先,我需要回忆一下Spring处理循环依赖的基本原理。Spring主要通过三级缓存来解决循环依赖,也就是在对象实例化后、属性填充前,提前暴露对象的引用。这样即使有循环依赖,也能通过提前暴露的引用完成注入。不过,面试官想知道的是在哪些情况下Spring无法解决这个问题。这时候,我得想到几种可能的情况。比如,构造器注入导致的循环依赖,因为构造器注入需要在实例化的时候就完成所有参数的注入,这时候对象还没有被放入三级缓存,所以无法解决。

2025-02-03 17:00:55 493

原创 计算机网络常见协议

计算机网络常见协议

2025-01-16 14:55:03 1163

原创 SpringBoot启动过程源码解析

SpringBoot启动过程源码解析

2025-01-03 15:41:34 879

原创 SpringMVC启动与请求处理流程解析

SpringMVC启动与请求处理流程解析

2025-01-01 13:54:38 1019

原创 [spring源码]spring之事务底层源码解析

[spring源码]spring之事务底层源码解析

2024-12-31 12:15:11 693

原创 [spring源码]spring之AOP底层源码解析(下)

[spring源码]spring之AOP底层源码解析(下)

2024-12-29 21:04:04 580

原创 JVM执行引擎JIT深度剖析

在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象所占的比例是很大的,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多。当一个方法被调用时,虚拟机会先检查该方法是否存在被即时编译过的版本,如果存在,则优先使用编译后的本地代码来执行。当解释器遇到一条回边指令时,会先查找将要执行的代码片段是否有已经编译好的版本,如果有的话,它将会优先执行已编译的代码,否则就把回边计数器的值加一,然后判断方法调用计数器与回边计数器值之和是否超过回边计数器的阈值。

2024-12-23 15:00:41 833

原创 ZGC深度剖析

ZGC(The Z Garbage Collector)是JDK 11停顿时间不超过10ms(JDK16已经达到不超过1ms);停顿时间不会随着堆的大小,或者活跃对象的大小而增加;支持8MB~4TB级别的堆,JDK15后已经可以支持16TB。这么去想,如果使用ZGC来做Java项目,像对STW敏感的证券系统,游戏的系统都可以去用Java来做(以前都是C或者C++的市场),所以ZGC的出现就是为了抢占其他语言的市场(卷!

2024-12-23 13:57:46 986

原创 JDK17新特性

从springboot3.0开始,已经不⽀持了。从3.0开始,转变为JDK17。官⽅维护的版本都是SpringBoot3.X的了,但是之前的版本也是可以⽤的,只是官⽅不再进⾏功能更新了.综上所述,选⽤Java17,概括起来主要有下⾯⼏个主要原因:1. JDK 17 是 LTS (⻓期⽀持版),可以免费商⽤到 2029 年。⽽且将前⾯⼏个过渡版(JDK 9-JDK 16)去其糟粕,取其精华的版本;2. JDK 17 性能提升不少,⽐如重写了底层 NIO,⾄少提升 10% 起步;

2024-12-22 23:27:03 1818

原创 [nacos源码]

[nacos源码]

2024-11-20 20:28:03 805

原创 [spring源码]spring之AOP底层源码解析(上)

[spring源码]spring之AOP底层源码解析(上)

2024-11-08 14:57:00 821

原创 [spring源码]spring配置类解析

[spring源码]spring配置类解析

2024-11-07 17:10:24 710

原创 [spring源码]spring启动流程

[spring源码]spring启动流程

2024-11-05 18:22:14 882

原创 [spring源码]spring推断构造方法

[spring源码]spring推断构造方法

2024-11-04 19:12:22 1006

原创 [spring源码]spring循环依赖

[spring源码]spring循环依赖

2024-10-29 17:01:08 897

原创 [spring源码]spring依赖注入源码

[spring源码]spring依赖注入源码

2024-10-27 18:02:31 797

原创 [spring源码]Bean生命周期源码(下)

[spring源码]Bean生命周期源码

2024-10-24 15:59:58 340

原创 [spring源码]Bean生命周期源码(上)

[spring源码]Bean生命周期源码

2024-10-23 20:15:02 1147

原创 [spring源码]spring底层核心原理

[spring源码]spring底层核心原理

2024-10-23 17:17:28 530

原创 [spring源码]spring底层架构核心概念

[spring源码]spring底层架构核心概念

2024-10-22 21:57:08 788 1

原创 BIO,NIO,直接内存,零拷贝

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,一般由操作系统提供。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议处理和通信缓存管理等等都隐藏在Socket接口后面,对用户来说,使用一组简单的接口就能进行网络应用编程,让Socket去组织数据,以符合指定的协议。主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接。

2024-10-22 16:06:49 937

原创 leetcode 59.螺旋矩阵II

链接:https://leetcode.cn/problems/spiral-matrix-ii/solutions/12594/spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x/使用num

2024-08-21 11:17:27 351

原创 leetcode 189.轮转数组

这道题我们通过观察可以得知,这个数组可以被分为两个部分,先把第一个部分逆序,再把第二个部分逆序,最后整体逆序,就得到正确答案了。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]

2024-08-14 13:06:25 289

原创 leetcode 169多数元素

注意这个元素是大于n/2的,我们可以拿普通的元素和这个多数元素进行抵消,最后剩下的就是多数元素,所以我们只需要遍历数组一遍。,返回其中的多数元素。多数元素是指在数组中出现次数。

2024-08-03 21:34:09 166

原创 leetcode 84柱状图中最大的矩形

那么我们的大思路就是遍历一边整个heights数组,求得每个i位置的最大矩形,再用Math.max去PK,最后就能得到正确的答案。矩形的计算公式是底*高,高我们已经知道了是heights[i],那么这个底我们怎么知道呢?根据观察可以知道矩形的底取决于左边最近的比我当前位置小的i,右边最近的比我当前位置小的i。现在就差解决一个问题,那就是来到了i位置,怎么求得这个位置的最大矩形。那这就是一个单调栈模型(单调栈大压小,如果小压大,就结算栈顶位置)最大的矩形为图中红色区域,面积为 10。

2024-07-30 09:51:26 231 2

原创 leetcode 105从前序与中序遍历序列构造二叉树

所以定义递归函数TreeNode f(int[] preorder,int L1,int R1,int[] inorder,int L2,int R2)这里的while(true),每次都需要去遍历数组,是可以用HashMap做一个预处理优化的。代表:我给你前序的L1到R1,给你中序的L2到R2,你给我返回整棵树的根节点;这道题能把递归函数f()编出来那么题目就迎刃而解了。就有了下面的优化版本。

2024-07-29 10:51:53 197

原创 leetcode 118杨辉三角

定义一个row来装每一层的结果List row = new ArrayList();这道题其实就是找规律,从图中我们不难看出每一层的长度其实就是1,2,3,4.....所以有if判断if (j == 0 || j == i){row.add(1);再用 for (int j = 0;所以题目要求我们求numRows层的杨辉三角,那么最外层的循环就是。再继续观察我们发现每一层的规律就是第一个数和最后一个数必然是1。对于普遍位置,其实就是上一层当前位置的值,加上一个元素的值。

2024-07-28 14:37:00 278 1

原创 历史订单冷热分离方案

本项目除了将订单完成15日的订单迁移到历史订单数据库,还需要对订单数据进行分析,所以通过Canal+MQ将完成的订单(完成、取消、关闭)迁移到历史订单数据库,在历史订单服务对订单数据进行统计分析,并通过定时任务迁移冷数据。订单的冷热分离是指根据订单的特性和需求,将订单数据划分为冷数据和热数据,以便更有效地管理和优化数据存储、检索和处理的方式。将冷数据从主要的数据库中归档到较为廉价的存储介质,例如使用固态硬盘(SSD)存储热数据,而将冷数据存储在传统磁盘或云存储中,也可以使用低成本的云存储服务。

2024-07-27 19:38:23 536

原创 冗余数据同步方案

商品用户客户员工店铺仓库供应商这些数据修改后,需要同步到历史快照订单,发货单,订货单,采购单,调拨单,出库入库单等等....,之前的逻辑是直接在update接口里面加上synchronousUpdate方法,同步更新对应的表,有时候一个业务的update可能对应二十多张目标表,完全耦合在了业务里,接口执行的效率和代码的可维护性都不强生产是在Handler里做的。

2024-07-26 16:49:42 706

原创 leetcode 23合并k个升序列表

要对一个lists = [[1,4,5],[1,3,4],[2,6]]合并为一个升序列表。这道题我们需要一种动态的数据结构去拿到三个列表中的最小节点。那么小根堆就能解决这个问题。

2024-07-16 09:56:29 191

原创 leetcode 42接雨水

思路:这道题我们只需要从每个i去考虑,考虑每个i位置能接到多少雨水,把每个i位置接到的雨水相加,就得到了总共能接到的雨水。用通俗的话讲就是左边的最大和右边的最大取一个最小值,再减去我当前的i的高度,就得到了目前i位置能接到的雨水。仔细观察我们可以发现i位置能接多少雨水是由Math.min(leftMax,rightMax)决定的。那么每个i位置到底能接到多少雨水呢?

2024-07-16 09:44:10 273

原创 并发编程的三大特性

不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题,用JMM屏蔽掉各种硬件和操作系统带来的差异。让Java的并发编程可以做到跨平台。JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算。然后再写回主内存中(不一定!原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他。i < 100;i++) {

2024-07-07 14:26:41 1095

原创 线程的基础概念

开销不同:毕竟进程和线程不是一个级别的内容,线程的创建和终止的时间是比较短的。:虽然多线程带来了一定的性能提升,但是再做一些操作时,多线程如果操作临界资源,可能会发生一些数据不一致的安全问题,甚至涉及到锁操作时,会造成死锁问题。如果在main线程中调用了t1.join(),那么main线程会进入到等待状态,需要等待t1线程全部执行完毕,在恢复到就绪状态等待CPU调度。不如要处理一个网络等待的操作,开启一个线程去处理需要网络等待的任务,让当前业务线程可以继续往下执行逻辑,效率是可以得到大幅度提升的。

2024-07-07 14:20:49 1020

原创 CMS垃圾收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器主要用于要求低延迟(即:提高响应速度)的互联网项目。设置CMS收集器参数:-XX:+UseConcMarkSweepGC。采用的是"标记-清除算法",整个过程分为4步(1)初始标记 CMS initial mark 标记GC Roots直接关联对象,不用Tracing,速度很快(2)并发标记 CMS concurrent mark 进行GC Roots Tracing。

2024-03-12 16:59:32 1256 1

原创 Java中线程的常用方法

线程的线程体,当一个线程开始运行后,执行的就是run方法里面的代码,我们不能直接通过线程对象来调用run方法,因为这并没有产生一个新的线程,仅仅只是一个普通对象的方法调用。Java中提供了一个线程调度器来监控程序中启动后进入就绪状态的所有的线程,优先级高的线程会获取到比较多。start方法是我们开启一个新的线程的方法,但是并不是直接开启,而是告诉CPU我已经准备好了,快点运行我,这是启动一个线程的唯一入口。调用某线程的该方法,将当前线程和该线程合并,即等待该线程结束,在恢复当前线程的运行。

2024-03-06 16:38:47 572

原创 Java中实现多线程的几种方法

通过继承Thread类或者实现Runnable接口、Callable接口都可以实现多线程,不过实现Runnable 接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法返回值,可以声明抛出异 常而已。前面我们介绍的两种创建线程的方式都是重写run方法,而且run方法是没有返回结果的,也就是main方法是不知道开启的线程什么时候开始执行,什么时候结束执行,也获取不到对应的返回结果。创建Thread对象,并把第三部的Runable实现作为Thread构造方法的参数。

2024-03-02 12:06:33 408

原创 Java设计模式之工厂模式

抽象工厂类(Abstract Factory):定义了一组用于创建一系列产品对象的方法,这些方法返回抽象产品类型的对象。具体工厂类(Concrete Factory):实现抽象工厂类定义的一组用于创建一系列产品对象的方法,每个方法返回具体产品类型的对象。抽象产品类(Abstract Product):抽象产品类中的方法通常是抽象的。具体产品类(Concrete Product):每个具体产品类对应一个具体工厂类。// 抽象产品 A// 具体产品 A1@Override。

2024-02-04 14:15:57 477 1

原创 Java设计模式之单例模式

构造方法用private修饰,别人无法直接从外部创建对象,只能通过调用getInstance()的形式,这里我们不考虑暴力反射的情况。饿汉式不管用到与否,类装载时都会进行实例化,占用不必要的内存,优点是简单实用。

2024-02-03 19:14:18 287 2

空空如也

空空如也

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

TA关注的人

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