自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 单例设计模式

单例模式(Singleton Pattern)是一种设计模式,它的目的是确保一个类在整个程序的生命周期内只有一个实例,并且提供全局访问点来获取该实例。

2024-08-13 23:39:24 444

原创 手动实现Socket通信

Socket通信流程分为以下:1. 启动服务端,监听客户端请求。2. 客户端发起请求,客户端与服务端建立连接3. 两端之间传递数据4. 关闭连接。

2024-07-25 22:58:04 168

原创 内存泄漏和内存溢出

而发生的场景通常是长期存活的对象占用短期存活对象的引用,导致短期存活的对象无法释放内存空间,无法被回收。如果使用 HashSet 或者 HashMap 的时候,由于hash值与存进来的hash值不同,所以就会导致找不到存入的对象,那么也就释放内存,可能导致内存泄漏。内存溢出是指是指当程序请求分配内存时,由于没有足够的内存空间满足其需求,从而触发的错误。,例如全局变量,在main方法结束后,变量依然没有被释放,这个时候如果有其他变量被这个变量引用,那么其他变量也不可以被释放。// 模拟多次调用某个方法。

2024-07-16 14:02:04 416

原创 Spring 事务

在初始化 Bean 的时候,会进行Bean的后置处理,后置处理时会遍历所有的切面,并查找与当前Bean相匹配的切面,在这里我们要获取事务的属性,有了属性之后才知道是否与切面匹配,这个属性也就是也就是。既然运行到第二个事务的 begin 的时候,A事务(外层的事务) 会自动提交,那就把 begin 和 commit 去掉,将 B 融入 A 事务中,这样就会使 A 事务失效。如果方法 B 有事务注解标识,但是同一个类中的方法 A 没有,A中的方法调用方法 B,此时外部调用方法A,方法B的事务会失效。

2024-06-05 15:03:22 915

原创 Spring AOP

AOP,也就是 Aspect-oriented Programming,译为面向切面编程。简单点说,就是把一些业务逻辑中的相同代码抽取到一个独立的模块中,让业务逻辑更加清爽。三分举个例子,假如我们现在需要在业务代码开始前进行参数校验,在结束后打印日志,该怎么办呢?我们可以把日志记录和数据校验这两个功能抽取出来,形成一个切面,然后在业务代码中引入这个切面,这样就可以实现业务逻辑和通用逻辑的分离。业务代码不再关心这些通用逻辑,只需要关心自己的业务实现,这样就实现了业务逻辑和通用逻辑的分离。

2024-06-04 22:17:31 918 1

原创 Bean作用域和生产周期已经Bean的线程安全问题

首先通过 createBeanInstanse 创建实例对象,这里使用反射机制利用 BeanClass 拿到类的构造方法,如果有多个构造方法,就拿有@Autowired 注解的构造方法,如果有两个有@Autowired 注解的构造方法,那么就会报错。选择好构造方法后,就要确定参数,这里会在体内的单例池内进行查找,如果找到了,那么通过反射就可以开始实例化对象了。单例 Bean 是线程不安全的,如果只对 bean 执行查询的操作,不对bean 进行修改,那么这个单例 Bean 是线程安全的。

2024-06-01 00:10:22 808

原创 Redis 完整

什么是 redis?是一种基于键值对的 NoSql 型数据库。与 hashMap 不同的是,Redis 中的 value 支持 string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、GEO(地理信息定位)等多种数据结构。而 HashMap 只是 redis 中的 hash ,他们俩结构是相同的。

2024-05-24 14:13:59 895

原创 MySql索引

首先来说 B+树,B 树 都是二叉平衡树的变种。而 InnoDB 用 B+是因为效率高。具体体现在:由于 B+ 树的非叶子节点只存储键,而不存储数据,所以每个节点可以存储更多的键值,从而使树的整体高度变低。由于每往下一层都是一次IO 操作,所以 B+ 树的查询效率高。并且B+ 树甚至可以,直接从结点开始遍历,总之效率更高。由于叶子节点是有指针相连的,所以对于范围的顺序访问是更方便高效的。由于非叶子节点存储的键值更多,所以缓存更容易命中。而不用红黑树的原因是因为树高太高了。

2024-05-18 15:21:53 484

原创 MySql基础架构

MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog 只有 InnoDB 有。引擎层是插件式的,目前主要包括,MyISAM,InnoDB,Memory 等。(存储架构)SQL 等执行过程分为两类,一类对于查询等过程如下:权限校验—》查询缓存—》分析器—》优化器—》权限校验—》执行器—》引擎。

2024-05-18 15:21:02 576

原创 synchronized 使用及实现原理

同步语句块的实现使用的是和指令,其中指令指向同步代码块的开始位置,指令则指明同步代码块的结束位置。修饰的方法并没有指令和指令,取得代之的确实是标识,该标识指明了该方法是一个同步方法。不过两者的本质都是对对象监视器 monitor 的获取。

2024-05-13 22:04:54 1268

原创 leetcode56--合并区间

排序的时间复杂度是O(n log n),遍历区间的时间复杂度是O(n),所以总的时间复杂度是O(n log n)。对于每个区间,我们检查它是否与前一个区间重叠。如果重叠,我们就将当前区间与前一个区间合并,即将当前区间的结束位置更新为这两个区间的结束位置的较大值。空间复杂度是O(n),因为在最坏的情况下,我们可能需要存储所有的区间(如果没有任何区间重叠)。中的最后一个区间合并,即将当前区间的结束位置更新为这两个区间的结束位置的较大值。:如果当前区间与前一个区间不重叠,那么我们就将当前区间添加到结果列表中。

2024-05-13 15:07:22 344

原创 Java内存模型(JMM)

如果 A happens-before B,那么无论这两个操作在不在一个线程内,都要保证 A 对 B 可见。

2024-05-10 00:20:18 700

原创 线程与进程

堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用于存放新创建的对象 (几乎所有对象都在这里分配内存),方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在这个状态下,线程暂时停止执行,直到它等待的事件发生。wait 用于让一个线程进入等待状态,可以做到线程之间的通信,它会释放该对象的锁,并进入等待状态。,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。在这个状态下,线程正在执行它的任务。

2024-05-09 23:59:49 568

原创 分布式锁讲解

然而,这也引入了一个问题:如果客户端在持有锁期间执行的操作超过了锁的过期时间,那么锁可能会在操作完成前被自动释放,导致其他客户端获取锁并执行操作,从而引发数据不一致。当一个节点需要获取锁时,它会尝试在共享存储系统中创建一个唯一的标识,如果创建成功,则表示获取锁成功;实现分布式锁通常涉及以下几个关键步骤,这里我将详细介绍基于Redis的分布式锁实现方法,因为Redis因其高性能和易用性而广泛用于实现分布式锁。注意,在实现锁的续租机制时,需要确保续租操作的原子性,避免在续租过程中锁被其他客户端获取。

2024-05-09 21:37:10 743

原创 leetcode--560和为k的子数组

具体表现就在于:如果先更新map,更新完成后,判断map中是否存在prefixSum - k ,如果恰好存在,且值恰好为算上当前节点的前缀和,但是这样并不能得出一定会有和相加为K的子数组,只有在map中没有当前前缀和的时候,才能判断出有相加和为K的子数组。空间复杂度为O(n),这是因为我们使用了一个哈希表来存储前缀和的出现次数,在最坏的情况下,每个前缀和都不同,哈希表的大小将和数组的长度成正比。说的再精确一点,就是从不包括当前节点的前缀和中的某个点,到当前点的子数组和为K。,用于记录前缀和的出现次数。

2024-05-09 00:56:46 996

原创 Java集合 总结篇(全)

因为 Hash 值范围非常大,但是空间是不能容得下这么多哈希值的,所以需要 Hash值 数组长度进行取模运算。也就是 Hash % length ,但是这个这个值是与 Hash & (length - 1 )是相等的。举个例子如果 数组长度是 16,hash值是 10101 ,hash & (ength - 1) = 10101 & 1111。这样可以看到 hash 值的后四位就可以被用来计算数组的索引。会方便计算,也可以使其分布更加均匀。(因为与 hash 值有关)。

2024-05-07 16:35:13 1059

原创 合并K个升序链表

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。链表数组如下:1->4->5,1->3->4,2->6将它们合并到一个有序链表中得到。

2024-04-24 23:07:27 906

原创 二叉树的层序遍历,翻转二叉树,对称二叉树讲解

(每次在小循环内,操作就是弹出父节点,然后加入父节点的孩子节点,知道这一行的父节点都弹出,size就是这个行节点的个数,所以有限制条件了,然后每一个小循环都会添加孩子节点,所以提前在大循环中小循环之外定义size=队列的个数)。中序时:遍历顺序是左中右,当我们先遍历左时,左部分的节点交换后,中间交换,那我们继续遍历右半部分节点使之交换时,因为我们已经交换过中间节点了,所以相当于原先的左半部分节点交换了两次,而右半部分节点没有交换,所以中序不可以。(后序代码只是将交换那一行的代码写到最后面。

2024-04-24 22:58:28 289

原创 JVM--Java对象到底存在哪?

Java对象存放在堆中,但堆又分为新生代和老年代,新生代又细分为 Eden、From Survivor、To Survivor。?堆分为新生代和老年代,新生代用于存放使用后就要被回收的对象(朝生夕死),老年代用于存放生命周期比较长的对象。我们创建的大部分对象,都属于生命周期较短的对象,所以会存放在新生代。新生代又细分 Eden、From Survivor、To Survivor,那我们创建的对象会优先在 Eden 区分配,见下图。

2024-04-23 21:17:24 1047

原创 JVM垃圾收集器--分区收集器

ZGC 的两个关键技术:指针染色和读屏障,不仅应用在并发转移阶段,还应用在并发标记阶段:将对象设置为已标记,传统的垃圾回收器需要进行一次内存访问,并将对象存活信息放在对象头中;G1收集器在垃圾回收的时候仍然需要STW,因为Young GC、Mixed GC 都是基于标记复制,标记复制算法有个转移的过程,这个过程是需要STW,而Full GC基于标记整理,标记整理的过程也需要STW。在G1中,有专门分配大对象的区域,叫做大对象区,当对象的大小超过设定大小的百分之五十时,这个时候,就可以将对象放入大对象区域。

2024-04-23 21:08:34 1291

原创 JVM垃圾收集器--分代收集器

垃圾收集器主要分为两大类:分区收集器和分代收集器。分代收集器的代表是CMS,分区收集器的代表是G1和和ZGC。

2024-04-22 23:11:04 757

原创 leetcode135 --分发糖果

n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。1请你给每个孩子分发糖果,计算并返回需要准备的。5你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。4你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。

2024-04-22 15:34:07 326

原创 JVM的运行时数据区

之前的文章有讲过,Java 源代码文件经过编译器编译后会生成字节码文件,并且经过类加载器加载之后会交给执行引擎执行,并在执行过程中,Java会划出一片空间去存储执行期间所用到的数据,这片空间成为运行时数据区。

2024-04-21 17:02:33 1367

原创 StringBuffer和StringBuilder

在 StringBuilder 对象的实现中,value 数组的长度是可以动态扩展,像ArrayList。

2024-04-19 23:27:29 756

原创 JVM 讲解 (主要类加载其以及流程和机制(双亲委派))

继承类,重写findClass()方法如果没有太复杂的需求,可以直接继承类,重写loadClass方法,具体可参考和。

2024-04-19 23:13:39 1243

原创 MySQL事务的实现

本文讲述了事务的四大特性的实现,原子性与持久性是通过日志去实现的,比较好理解。关于隔离性,我们需要根据实际情况需要的隔离级别去调整,不可以直接使用最高级别,这样会导致效率过低。至于隔离性,本文讲的是ACID的隔离性,实际问答中,要确认是ACID还是CAP中的一致性,两者有根本性的不同,如果要看CAP隔离性,可以去看 javabetter.cn 大佬的网站。

2024-04-18 16:12:20 941

原创 MySQL 的事务概念

所谓的数据库对象,指的就是数据库、表、视图、存储过程等等这些东西。当我们使用CREATE、ALTER、DROP等语句去修改这些所谓的数据库对象时,就会隐式的提交前边语句所属于的事务。BEGIN;SELECT ... # 事务中的一条语句UPDATE ... # 事务中的一条语句... # 事务中的其它语句CREATE TABLE ... # 此语句会隐式的提交前边语句所属于的事务。

2024-04-18 00:38:58 1252

原创 Leetcode5--最长回文子串(双指针中心扩散法)

给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。"bab""aba" 同样是符合题意的答案。

2024-04-17 13:40:06 638

原创 leetcode--3 无重复最长字串

给定一个字符串s,请你找出其中不含有重复字符的的长度。3因为无重复字符的最长子串是"abc",所以其长度为 3。1因为无重复字符的最长子串是"b",所以其长度为 1。3因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是的长度,"pwke"是一个子序列,不是子串。

2024-04-15 16:39:16 954 1

原创 TCP协议--传输机制

TCP协议是对数据传输提供的一个管控机制,主要体现在可靠和效率两个方面,即在保证数据可靠传输的情况下尽可能的提高效率。

2024-04-14 12:57:11 1062

原创 数据结构,算法(一)--排序

两次for循环 一次循环可以将一个数据排好序,那两次for循环叠加就可以将整个数组的数据排好序。游标 i 从左到右遍历数组,找到数组中最小值。让最小值和待排序数组中的第一位进行交换。

2024-04-14 12:30:06 624

原创 Java并发--内存结构图及线程安全

Class。

2024-04-14 12:22:54 1048

原创 Java并发--锁

同步语句块的实现使用的是和指令,其中指令指向同步代码块的开始位置,指令则指明同步代码块的结束位置。修饰的方法并没有指令和指令,取得代之的确实是标识,该标识指明了该方法是一个同步方法。不过两者的本质都是对对象监视器 monitor 的获取。

2024-04-14 10:30:00 1341

原创 Linux常用命令介绍

cd命令可以进入某 个目录中,例如 cd opt, 意思就是进入opt目录中,但是opt 必须在你现在的目录中是可见的,例如m 1文件夹包括opt文件夹,而不能m 1包括m 2包括opt文件夹。这个需要一个一个删,先进入文件夹里,然后再删除文件夹里的文件,一层一层的问你是否删除,如果删除按y, 如果不删除按n。cd /是进入根目录,当我们有文件夹opt在根目录中的文件夹var中的时候,我们此时在根目录下的一个文件夹中,我们可以cd /var/opt.w是保存的意思,q是退出的意思。

2024-04-13 18:30:16 817

原创 leetcode46--全排列

给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以返回答案。

2024-04-13 18:26:26 867

原创 Java集合(一)--Map(2)

在JDK1.7时,底层采用的是分段数组+链表的形式,在JDK1.8之后,采用的是与HashMap相同的形式,数组+链表/红黑树。只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,就不会影响其他 Node 的读写,效率大幅提升。o(n)->o(logn),ConcurrentHashMap利用的是node数组+链表+红黑树的方式去实现,并且并发控制使用synchronized和CAS去实现操作。当冲突链表达到一定程度的时候,链表会转换成红黑树,一般来说阈值是8,多个线程访问时,

2024-04-13 14:59:54 956 2

原创 Java集合(一)Map(1)

HashSet 底层是由 HashMap 实现的,它可以实现重复元素的去重功能,如果存储的是自定义对象必须重写 hashCode 和 equals 方法。HashSet 保证元素不重复是利用 HashMap 的 put 方法实现的,在存储之前先根据 key 的 hashCode 和 equals 判断是否已存在,如果存在就不在重复插入了,这样就保证了元素的不重复。

2024-04-13 11:52:42 1543

原创 Java并发(2)--内存模型

主内存:所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量,还是局部变量,类信息、常量、静态变量都是放在主内存中。为了获取更好的运行速度,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。本地内存:每个线程都有一个私有的本地内存,本地内存存储了该线程以读 / 写共享变量的副本。每个线程只能操作自己本地内存中的变量,无法直接访问其他线程的本地内存。如果线程间需要通信,必须通过主内存来进行。

2024-04-12 23:12:12 1052

原创 Java并发(1)--线程,进程,以及缓存

而创建多个线程,这些线程可以被映射到底层多个 CPU 上执行,在任务中的多个线程没有资源竞争的情况下,任务执行的效率会有显著性的提高,约等于(单核时执行时间/CPU 核心数)。,如果数据处理量很大的话,多线程可能会发生覆盖的问题,例如两个线程都给a累加5000次,那么a的极端情况可能会是2,可能导致线程1和线程2的累加操作互相覆盖,第一个线程刚累加第一次,a变成2,然后进程切换,返回给内存,a又变成1。线程与进程相似,但线程是一个比进程更小的执行单位。新建,就绪,运行,等待,阻塞,死亡。

2024-04-12 21:29:31 1391

原创 Redis缓存穿透、击穿、雪崩

Redis是一个流行的内存数据库,但在使用过程中,确实需要注意一些缓存相关的问题,比如缓存穿透、缓存击穿和缓存雪崩。

2024-04-11 23:11:40 759

空空如也

空空如也

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

TA关注的人

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