自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring底层核心原理概述

SpringBean创建核心流程

2022-06-19 00:10:49 190 1

原创 LeetCode05

给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”提示:1

2022-06-01 00:45:32 154

原创 Spring Cloud Alibaba之Nacos初体验

一、Nacos的下载安装下载地址解压下载的完成的tar包,会得到如下的目录结构:在这里我们使用伪集群的方式启动集群,复制多份刚解压的数据详细的如下图所示:修改Nacos配置信息(记住在一台机器上记得修改端口号):数据库创建表:执行目录conf/nacos-mysql.sql的sql生成表结构逐台启动应用登录界面查看:逐台使用启动命令:bin/startup.sh二、SpringBoot集成Nacos1 . 引入依赖<?xml version="1.0" encoding="UT

2022-05-31 23:06:46 151

原创 LeetCode02

一、题目描述给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。二、测试数据输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9

2022-05-31 00:27:23 113

原创 LeetCode21

一、题目描述将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。二、测试数据输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减顺序 排列三、分析以

2022-05-29 13:48:44 163

原创 LeetCode448

一、题目描述给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。二、测试数据示例 1:输入:nums = [4,3,2,7,8,2,3,1]输出:[5,6]示例 2:输入:nums = [1,1]输出:[2]提示:n == nums.length1 <= n <= 1051 <= nums[i] <= n进阶:你能在不使用额外空

2022-05-28 15:41:15 130

原创 LeetCode283

一、题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。二、测试数据示例 1:输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]示例 2:输入: nums = [0]输出: [0]提示:1 <= nums.length <= 104-231 <= nums[i] <= 231 - 1进阶:你能尽量减少完成的操作次数吗?三、分析

2022-05-28 14:52:32 106

原创 jvm基础之类加载机制

一、何时触发类加载以及类加载的步骤类加载顾名思义只有类在元空间没有找到的时候才会去加载,在元空间已经存在的自然不会去加载。首先看看类加载的完整步骤:加载:在这里的加载可以从磁盘、网络、动态生成描述一个类的字节码。验证:验证字节码的是否符合的JVM的规范,只有符合规范的字节码才会继续执行下面的步骤否则校验不通过。准备:给类的静态变量分配内存、并且赋予默认值。列如给int的默认值是0 、Boolean的默认值是false解析:将符号引用转换为直接引用。如下面的num1就是一个符号引用在开发中方

2022-05-28 14:12:47 83

原创 Redis之缓存更新策略

一、常见的缓存更新策略以及存在问题先更新数据库然后更新缓存,就像下面的代码: public Product update(@Valid @NotNull(message = "商品更新对象不能为null") Product product){ Product productResult = productDao.update(product); redisUtil.set(getCacheKey(productResult.getId()),productToJ

2022-05-22 11:11:54 907

原创 Redis之分布式锁实现

最近在工作中使用到了分布式锁,特此总结一下便于加深自己理解。将会从如下的几个方面进行讲述。一、如何实现实现一个分布式锁分布式锁的实现本质上就是基于redis的命令去实现的,setnx按照官方的定义是这样的:Redis SETNX 命令用于将 Redis 的 KEY 的值设为 value ,当且仅当 KEY 不存在。若给定的 KEY 已经存在,则 SETNX 不做任何动作。那按照这个定义去试一试会得到如下的结果:2. 实现一个简单的分布式锁的代码如下 public String te

2022-05-21 17:20:25 215

原创 MySQL基础之索引

一、什么是索引一句话概述:索引可以让MySQL快速的获取数据并且是一种排好序的数据结构。二、索引底层数据结构的选择在计算中常见的数据结构有很多,我们从如下的几个数据结构中分析一下MySQL是如何选择的链表:链表是一种非常常见的数据结构,获取数据的时间复杂度是O(n),在链表中插入一个数据时间复杂度是是O(1)。但是在MySQL中为何没有选择链表作为底层的数据结构呢?我们想想平时在一张表中一般都是存在几百万甚至上千万的数据。就单纯使用一个字段做索引链表的长度都是几百万甚至上千万个节点,这么大的数据量

2022-05-20 13:02:43 113

原创 java基础之-HashSet

一、HashSet底层基础数据HashSet的底层是基于的HashMap去实现的这个似乎没有什么可说的这个直接看HashSet的源码public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{ static final long serialVersionUID = -5024744406713321676L

2022-05-19 21:27:54 1582

原创 LeetCode88

一、题目描述给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。二、测试数据示例 1:输入:num

2022-05-19 21:07:10 218

原创 LeetCode01

一、题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。二、测试数据示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,

2022-05-19 20:52:24 50

原创 LeetCode70

一、题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?二、测试测试数据示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶三、思路分析走上第n步楼梯的方式有如下的两种:a.从第n-2一次性跨上去。b.从第n-1跨上去。所以走法

2022-05-18 00:15:00 101

原创 Java基础之-HashMap

一、HashMap核心参数分析初始化大小:static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;在源码中社会的hash桶默认的长度是16,简单说就是当初始化HashMap的时候没有指定初始化容量的大小使用的是默认值,详细的源码如下: // 没有制定容量大小时,初始化的时候会先制定的默认的扩容因子 public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTO

2022-05-17 13:24:40 183

原创 SpringBoot使用Ehcache实现缓存预热

一、使用场景最近在项目中使用Ehcache作为jvm级别的缓存加快请求的响应速度。但是Ehcache需要在使用的时候才会去加载数据。这样在第一次请求的时候数据还是会打到数据库。基于此需要实现一个基于Ehcache的缓存预热的功能。二、实现代码@Slf4j@Datapublic class PoliciesCacheLoader implements BootstrapCacheLoader { private boolean asynchronous; private Ra

2021-10-27 12:25:45 725

原创 Git修改远程分支名称

最近需要将项目迁移到统一的发布平台上。但是在迁移之前需要修改项目的git分支命名规范符合发布的平台的要求。就简单的记录一下的git重新命名远程分支的步骤:删除远程分支git push --delete origin old-branch修改本地分支的名称git branch -m old-branch new-branch推送本地分支git push origin new-branch到此为止的修改分支的打工告成。但是需要的注意的是在后面向远程分支推送代码的时候需要带上新分

2021-07-11 15:38:20 392

原创 设计模式-单例模式

最近开发的时候遇到这样的需求,在数据源被加载进来之后会首先判断当前的数据源是否是可用的,在可用的情况下在执行其他的操作。判断的数据源是否是可用的自然就需要连接到数据源然后执行一些判断的逻辑。连接到数据源只需要使用java创建一个简单的连接就行,如果不重用已经创建的连接在大量用户使用的情况下会创建很多连接导致数据源不稳定从而影响业务方的正常使用。因此就结合guava实现了一个简单的连接缓存对象如下所示:public abstract class BaseCacheManager<K, V> {

2021-07-11 15:20:33 75

原创 实现一个带有过期时间的缓存

最近处理做逻辑需求的时候的需要实现一个带有时间的缓存工具。具体的实现如下:import com.google.common.cache.*;import lombok.extern.slf4j.Slf4j;import java.util.Map;import java.util.concurrent.TimeUnit;/** * <p> * 连接池缓存的抽象类 * </p> * * @description: * @author: * @date: 2

2021-07-02 13:06:44 577

原创 java并发之ThreadPoolExecutor

一、Java线程模型在Linux中的线程模型分为两种:ULT(用户线程模型)线程的的生命周期是由应用自己去管理。KLT(内核线程模型)用户的生命周期是由Linux的内核进行管理。在java中使用的是KLT的线程模型,Java线程和操作系统层面上的线程是一一对应的。线程作为一组任务任务的执行单元自然也有自己的生命周期。在Java中的线程生命周期分为如下的几个:新建状态(NEW)。当使用new关键字创建实例化一个线程对象的时候的线程就是处于新建状态。可运行态(RUNNABLE)。当线程调用star

2021-06-28 13:08:01 238

原创 从JVM层面剖析一个对象的创建的过程

一、对象创建的流程在java中当需要创建一个对象的时候,通常使用如下的方法创建一个对象:Object object = new Object();那当jvm执行这条语句的时候的在其内部是怎样的一个数据流程呢?在每一个流程中都做了哪些工作?为了解决这个上述的问题。我们先来看看如下的一张对象的生命周期流程图:二、何时会出发一个对象的创建1.当我们使用new关键字去准备去实例化一个对象的时候。就会出发对象的创建。如下的代码段是创建一个简单的Object对象的代码:public class Ma

2021-06-21 00:01:28 235

原创 基于Redisson实现分布式锁

最近有业务需求需要使用到分布式锁就基于Redisson简单的写了一个@Configurationpublic class RedissonClientConfig { //"redis://10.10.100.116:6379" @Value("${redis.conn.url}") private String redisConnUrl; @Value("${redis.cluster:true}") private Boolean standAlone;

2021-06-09 09:31:02 72

原创 JVM运行时数据区解析

一、JVM类执行流转的流程我们在开始学习Java语言的时候就知道的JVM可以一次编译多次运行。与操作系统底层不相关。那它时如何实现这样的特性的呢?其实很简单就是通过JVM呗。我们在他们的官网可以看到如下的图片:提供了不同平台的JDK。而在JDK的底层又是通过JVM去屏蔽底层的操作系统的差异。一个类需要运行。首先肯定需要将类的描述文件加载到JVM中。那在JVM谁来做这件事呢?就是类加载子系统实现类的检查、验证和加载。而类加载子系统中类加载器就在其中扮演着非常重要的角色。在Java中内置的类加载器有三种

2021-06-03 13:16:34 88

原创 自旋使用容器没有clean导致的OOM问题排查分析

一、背景某天还是按照原有的迭代计划,正常迭代项目。在测试环境测试没有问题之后到了发布上线的流程。可是到了上线那天晚上当应用刚发布的上去容器疯狂报警内存使用过高。短时间内容器从四个直接扩容到了十个。意识到事情不对赶紧执行了回滚。二、过程分析回滚之后让运维同学帮忙把内存的dump搞下来。使用jvisualvm打开内存镜像得到如下的分析结果看到这个错误第一时间想到的是使用Mybatis批量的执行insert的数据量太大导致了内粗的溢出。在谷歌上看了看也有这样的说法。原来是3000一批的写入数据。使用二

2021-06-02 22:30:53 75

原创 抽象队列同步器AQS应用之Lock详解

一、ReentrantLock的使用public class AQSLock { private static int count = 0; private static ReentrantLock lock = new ReentrantLock(true); public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch =

2021-05-31 00:24:52 217

原创 一个空格引发的Cannot find cache named ‘****‘ for Builder[*****]

一、发生的背景之前项目由于使用用户变多,响应的速度变慢。去加了一波JVM级别的缓存。不料在测试的时候出现了如下的问题java.lang.IllegalArgumentException: Cannot find cache named 'getSysConfigPermissions' for Builder[public.*.getSysConfigPermissions(java.lang.String)] caches=[getSysConfigPermissions] | key='#sysNa

2021-05-19 19:41:22 4067

原创 泛型接收参数报错java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to ***

一、业务场景最近有新的功能迭代修改的修改之前的代码,,考虑到扩展性就将代码做了如下的修改public class TopicInfo<T> extends KafkaTypeBase { /** * topic的基本的信息 */ @NotNull(message = "TopicInfo不能为null") private T topicInfo;}但是在写完代码测试的时候得到了如下的报错java.lang.ClassCastExcep

2021-05-13 12:35:30 1815

原创 线程生命周期

线程生命周期一、Java线程生命周期新建状态(NEW)线程已经被创建,但是还不准分配CPU进行运行。这个是在每一种编程状态特有的。就像在java中使用new Thread()创建一个线程对象。此时的线程就处于一个新建状态。这也就是在创建一个线程对象之后调用run方法就和运行普通的方法一样的原因。本质上都是都在调用线程中调用对象方法。可运行状态(RUNNABLE)新创建的线程对象已经可以分配CPU,根据不同的调度算法只要有空闲的CPU分配到时候,线程就可以真正的开始运行。此时的线程在已经在

2020-12-23 21:44:41 99

原创 线程

线程一、用户空间内核空间用户空间:是所有正常用户进程运行的位置,就像在我们自己电脑上的IDEA,PostMan等这些用户软件。在用户空间运行的进程只能访问除了内核空间之外其他的部分。运行这个用户空间的代码不能之间访问内核空间,但是如果一定要访问那如何处理呢?可以通过内核空间提供的接口(系统调用)实现对内核空间的访问,在执行系统调用的时间,会有用户空间的进程发出系统调用的请求,这时候会有一个软件中断信号发送到内核,内核会分配对应的中断处理程序。在处理完成之后返回,用户空间代码继续执行。内核空间:

2020-12-20 16:02:44 123 1

原创 MESI学习

MESI学习一、出现MESI的原因计算机模型目前现有的计算机都是基于–冯诺依曼计算机模型 。等待运行的程序以及数据都是存放在主内存上,在计算的时候,按照程序执行的顺序首先会从主内存中取出数据,然后通过控制器的翻译执行指令的要求,然后在将计算的结果写回内存。一直计算知道程序被执行完成。在这样的计算机模型中的核心组件控制器:是整个计算机的控制中心,负责将程序规定的信息进行解释,然后根据要求进行控制,调度程序、数据、地址、协调计算机每一个部分之间的工作计算器:在接受到控制器的指令对指定的数据进行

2020-12-19 16:48:42 249 1

空空如也

空空如也

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

TA关注的人

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