自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot的自动装配原理

继续进入@EnableAutoConfiguration,发现有个@Import注解,它引入了一个核心类,可以去将META/INF/spring.factories文件中所有的全路径类名的类加载到spring容器中。进入@AutoConfigurationPackage注解,里面也是引入了一个核心类,可以将spirngboot启动类目录及其子目录下的所有bean加载到spring容器中。进入这个注解,里面有@EnableAutoConfiguration,这个注解表示开启springboot自动装配。

2025-03-29 16:52:49 338

原创 谈谈你对多态的理解

多态是面向对象三大特征之一,我的理解就是多态可以使不同的对象,去调用同名的方法的时候有不同的实现。

2025-03-29 16:16:35 233

原创 Mysql中各种连接的区别

left join会返回左表的数据,以及右表匹配的数据,不匹配的数据会显示为null。内连接:通过inner join连接两个表,返回两个表中的匹配的数据,不匹配的不显示。right join右表的所有数据,以及左边匹配的数据,不匹配的数据显示为null。外连接:主要分为左连接(left join)和右连接(right join)。

2025-03-24 18:32:08 195

原创 java对象的生命周期

java对象的生命周期可分为。

2025-03-24 16:22:53 819

原创 Mysql的锁

表级锁:锁住一整张表,针对非索引字段加的锁,sql没有用到索引就会使用全局锁,性能较低。行级锁:针对索引字段加的锁,会锁住一行记录,并发性能高。全局锁:锁住一整个库,让数据库处于只读状态,一般在数据备份时用到。当update、delete的时候没有命中唯一索引或者索引失效,会走全表扫描加上表锁,性能很低。

2025-03-23 11:16:55 285

原创 Spring的传播行为

Nested,如果存在外层事务则嵌套外层事务,不存在则新建一个事务。嵌套事务的意思是如果外层事务提交,嵌套事务也会提交;外层事务回滚,嵌套事务就会回滚;这种场景适用于允许部分失败的业务,比如一个订单中有多个商品,其中有个商品库存不足了,只需要回滚那个商品就行了,其余商品可以下单成功。Required是spring事务默认的传播行为,如果存在外层事务就会融入外层事务,如果没有则新建一个事务。spring的事务传播行为指在一个开启了事务的方法内,去调用了另一个方法,那么事务会怎么传播呢?

2025-03-21 11:24:40 266

原创 索引的设计原则

3.对于区分度越高的列,建立索引的效果越好。对于唯一的列,索引效果最佳;如果有多个重复值的列,索引效果不好。1.where、order by、group by后的字段,还有join时的连表条件的字段适合建立索引。4.区分度最高的列放在联合索引的最左侧,更频繁使用的列放在联合索引的左侧。2.不要给每个列单独建立索引,尽量使用联合索引。5.对于较长的索引列,可以使用前缀索引。6.单表的索引数最好不要超过5个。

2025-03-21 10:31:40 92

原创 受检异常和非受检异常

非受检异常指在编译时不强制我们去捕获或者抛出的异常,所有的RuntimeException都是非受检异常,比如NullPointerExcetion、IndexOutOfBoundsException。受检异常指在编译时需要我们强制去捕获或者抛出的异常,比如IOException、SQLExcetion。受检异常的好处就是在发生这些异常的时候,我们能及时去做一些相应的处理,比如发生SQLException的时候我们可以去通过try-catch去捕获,然后及时的关闭数据库连接池对象。

2025-03-20 14:14:02 454

原创 为什么重写了equals必须要重写hashCode?

hashcode方法用于获取对象的哈希码,一般用于快速找到对象在容器中的索引位置以及快速判断对象是否相等。比如说set集合,它其中的元素是唯一的,我们往set集合里put元素的时候,它会先去判断set中有没有元素和加入的元素的hashcode相等,如果没有就直接加入set,否则就用equals判断是否相等,不相等就加入set,否则就不加入。因为hashcode可能会发生哈希冲突,所以如果两个对象的hashcode相等,它们的equals不一定相等。

2025-03-19 20:54:44 144

原创 ==和equals的区别?

比如String类就重写了equals方法,它会先用==判断两个对象的内存地址是否相同,相同直接返回true,不相同再去判断字符串的内容是否相等,相等返回true,否则返回false。如果没有重写equals方法,会去调用Object类的equals,其实就是去用了==比较两个对象。equals是Object类的方法,所以所有的类都有equals方法。如果重写了equals方法,会按照重写的逻辑来判断对象是否相等。对于引用数据类型,比较的是它们的内存地址。对于基础数据类型,比较的是值是否相等。

2025-03-19 20:36:22 212

原创 String、StringBuffer、StringBuiler的区别

String是不可变的,这是因为String内部用于存储数据的char[]数组用了final关键字修饰,而且是private的,并且没有对外提供修改数组的方法。StringBuffer和StringBuilder是可变的,它们内部的char数组没有用final关键字修饰。StringBuffer中的方法都用了Synchronized修饰,也是线程安全的。String不可变,每次操作String都会生成新的对象,它的性能最低。由于String是不可变的,所以它是线程安全的。String适合操作少量的数据。

2025-03-19 20:28:48 200

原创 引用拷贝、浅拷贝和深拷贝

浅拷贝去拷贝对象时,会在堆上新建对象,对于基本数据类型的属性,会直接拷贝其值;而对于引用类型的属性,会拷贝它的引用地址。引用拷贝会去拷贝对象的引用,也就是对象的内存地址,不会在堆上新建对象。深拷贝会完整的拷贝对象,包括它的引用类型的属性。

2025-03-19 20:10:22 153

原创 线程池的核心参数

线程池帮助我们管理监控线程,通过重复利用线程,来防止频率创建和销毁线程带来的性能消耗。可以使用ThreadPoolExecutor或者Executors来创建线程。

2025-03-19 14:50:25 827

原创 一文了解ThreadLocal

ThreadLocal是每个线程私有的,线程可以把自己的私有数据放到ThreadLocal里面,不用担心其他线程访问到自己ThreadLocal。通过set()方法将值存入ThreadLocal或者修改值,get()方法取出值,remove()方法移除值。

2025-03-19 11:10:46 483

原创 ConcurrentHashMap实现原理

ConcurrentHashMap是线程安全的HashMap,他在jdk1.7和1.8中有不同的实现。

2025-03-16 16:34:18 266

原创 ReentrantLock的实现原理

AQS全称抽象队列同步器,是java中的一个抽象类,它提供了一个通用框架用于实现同步器。AQS中有一个state属性,默认为0,如果被某个线程修改为1了,那么这个线程就拿到了锁,可以去访问资源。多线程来抢锁的时候,使用CAS操作来修改state的值,没有修改成功的线程会加入AQS内部的一个双向队列中阻塞等待,当锁释放时,队头线程会被唤醒,尝试自旋抢锁,没抢到就阻塞。

2025-03-16 15:27:25 125

原创 synchronized原理

synchronized关键字可以保证被修饰的方法或者代码块任意时刻只有一个线程执行。

2025-03-16 11:11:19 143

原创 一文了解CAS

CAS全程:Compare And Swap(比较并交换),是乐观锁思想的一种体现,能在无锁的情况下保证线程安全。Java中的CAS是由native方法实现的,底层通过硬件层面保证了CAS操作的原子性。CAS是如何保证线程安全的?如下:CAS操作会去比较工作内存中的旧值和内存中的预期值是否相等,相等才会将其改成新值。如下线程A来修改a,a旧值是100,去和主内存中的a比较,发现相等了,于是在工作内存进行a++操作并同步到主内存。

2025-03-15 20:25:44 269

原创 Java中的volatile关键字

volatile是一种轻量级的同步机制,它相比于synchronized这种重量级锁更轻量,因为它不会造成线程上下文的切换,但是同步性更差,volatile关键字可以保证变量的可见性以及禁止指令重排序。

2025-03-15 19:49:56 302

原创 一文了解JVM的垃圾回收

当进行垃圾回收的时候,会暂停所有线程去完成垃圾回收。Minor GC :发生在新生代的垃圾回收,当eden区满了会触发,暂停时间较短。Full GC:对新生代和老年代进行完整的垃圾回收,当老年代内存不足时会触发,暂停时间长,要尽量避免。

2025-03-13 21:04:32 1821

原创 Java类加载过程

类加载过程分为加载、连接、初始化,连接过程又可分为验证、准备、解析。

2025-03-13 11:16:24 275

原创 Java的类加载器,双亲委派机制

类加载器负责将class文件加载进JVM中,使java程序运行。

2025-03-13 09:42:51 169

原创 JVM内存结构

JVM虚拟机运行java程序时所管理的内存区域,称为运行时数据区。

2025-03-11 20:59:53 950

原创 Spring Aop的实现方式

aop是一种面向切面编程的思想,主要就是为了降低代码的耦合度,比如我们有很多方法都需要去记录日志,如果这些方法中都去写记录日志的代码,太冗余了,于是可以用面向切面编程的思想,去定义一个切面,去横向切入到需要记录日志的地方。

2025-03-11 19:27:00 145

原创 Spring Bean的生命周期

首先Spring会去扫描xml、注解,把所有的BeanDifinition对象注册到容器中,BeanDifinition对象主要包含了类的一些信息(类名、方法、构造器、属性等)。然后筛选出单例的BeanDifinition,通过反射去实例化bean,对于原型bean是当去使用它的时候再实例化。然后再调用bean的后置处理器的after方法,Spring Aop就是在这里实现的。spring bean的生命周期主要分为四个阶段:实例化、属性填充、初始化、使用和销毁。最后使用完bean并销毁。

2025-03-10 16:58:31 167

原创 线程的生命周期

等待:调用wait方法,进入等待状态,当调用notify方法时会唤醒线程,重新进入就绪状态。阻塞:线程抢锁失败,会阻塞,当获得锁会进入就绪状态,抢到cpu时间片进入运行状态。超时等待:调用sleep方法进入休眠,休眠多久可以设置,时间到了进入就绪状态。新建:当我们去new Thread的时候,线程就处于新建状态。运行:线程抢到了cpu时间片,执行run方法。就绪:调用了start方法,线程准备运行。终止:线程执行完run方法,终止变成垃圾。

2025-03-09 16:03:18 112

原创 创建线程的四种方式

在我们需要线程执行完任务有返回值的时候,可以去实现runnale接口,需要重写call方法,在call方法内线程去执行任务,执行完成后会有返回值。需要注意的是new Thread()不能传Callable的实现类,没有这个构造方法,需要用FutureTask包装一下,然后传FutureTask进去。

2025-03-09 15:29:56 192

原创 Redisson分布式锁原理

redisson分布式锁是可重入、可重试、以及可以自动续期的。它是基于set nx互斥命令实现的,获取锁i就是去set nx,只有第一次set能成功,之后都会返回失败,释放锁其实就是去删除key。那么它是如何实现可重入、可重试、以及自动续期的呢?

2025-03-09 11:26:30 282

原创 Redis主从同步原理

从节点像主节点请求数据同步,主节点先判断从节点是不是第一次进行同步,如果是第一次的话,主节点会调用bgsave,frok一个主进程,生成RDB文件发送给从节点,从节点收到后清空本地数据,加载RDB文件。如果主节点在生成RDB的过程中,有写操作来修改数据怎么办?Redis会把这些写操作记录到repl_baklog日志中,然后发送给从节点,从节点执行命令同步数据。

2025-03-09 10:41:58 208

原创 怎么保证消息的幂等性?

消息的幂等性指就算多次消费同一消息,也只有第一次消费才会生效,就是不重复去消费消息。

2025-03-08 16:06:26 201

原创 RocketMQ的持久化机制

RocketMQ的持久化指将消息存放到磁盘中,以便可靠的存储消息以及索引消息。消息会存放到 commit log 文件中,采用顺序写写入commit log,大小为1G,满了之后会生产新的commit log文件。

2025-03-08 14:17:10 131

原创 RocketMQ怎么保证消息不丢失?

RocketMQ在生产阶段、消费阶段、消息持久化阶段消息可能会丢失。

2025-03-07 19:53:05 274

原创 Redis缓存过期删除策略和缓存淘汰策略

redis的缓存过期了需要根据缓存过期删除策略来删除缓存,节省内存空间。这种删除策略,当缓存过期之后,不会立刻删除,而是等我们再次去用到这个缓存的时候,才会去删除它。优点:对cpu友好,只有在使用缓存的时候才会去删除,对于用不到的缓存不会去删除。缺点:对内存不友好,一些一直用不到的缓存无法得到释放。定期去检查一些缓存是否过期,删除其中过期的缓存。优点:能有效的释放过期缓存占用的内存缺点:删除频率和时长不好决定。

2025-03-07 17:01:49 218

原创 Redis的持久化机制

在linx系统中,所有的进程都无法去操作物理内存,所以进程中会维护一个页表,它记录着虚拟内存和物理内存的映射关系,这样redis就可以去操作虚拟内存,然后关联到物理内存。,主进程在进行写操作的时候,不会直接去修改内存数据,而是拷贝需要修改的数据,去修改拷贝的数据,并且修改页表的映射关系,之后读操作就会读到拷贝的新数据。AOF默认是关闭的,需要到redis.conf中打开。来生成快照文件,sava是由redis主进程来执行,会阻塞其他命令,而bgsave由redis的子进程来执行,不会影响主进程。

2025-03-07 16:37:19 181

原创 Redis的哨兵机制

哨兵用于监控redis主从节点的状态,并在主节点发生故障的时候选举出一个新的主节点,实现故障转移,保证了redis的高可用性。哨兵基于心跳检测去监控redis节点的状态,每秒发送ping命令给主从节点和其他哨兵。选举出新的主节点后,哨兵会通知所有节点新的主节点,并且通知redis客户端新的主节点。之后判断从节点的offset,offset越大说明与主节点数据越接近,越优先。首先判断主节点与从节点的断开时间的长短,如果超过指定值的从节点不会选举。)都认为节点主观下线,哨兵集群会把这个节点标记为。

2025-03-06 16:22:01 124

原创 缓存与数据库的双写一致性问题

先删缓存再更新数据库出现问题的情况,是在删除缓存和更新数据库之间有其他的线程来查询缓存,是在写缓存和写数据库之前插入了查询缓存和数据库的操作,我们知道写操作一般是要比查询操作要慢的,所以是有概率出现这种情况的。线程1去删除缓存并更新数据库,更新数据库还未完成这期间,线程2来查询缓存未命中,于是去查询数据库的旧数据,并且把旧数据写入了缓存,最后线程1去更新了数据库,这样就导致了数据库和缓存数据的不一致。先删除缓存,再更新数据库,延迟一段时间后,又去删除缓存,这样可以将旧缓存删掉,保证最钟一致性。

2025-03-06 14:37:09 1099

原创 mysql主从同步原理

mysql主从同步依靠的是bin log(二进制日志),在主库的DML和DDL语句会存到bin log中,然后主库会和从库建立连接,将binlog日志发给从库,从库接受到后存入到中继日志中,之后再执行中继日志中的sql语句,从而实现主从同步。

2025-03-03 16:08:33 143

原创 MySQL的MVCC机制

简单来说就是判断当前事务id是否在活跃事务id集合中,如果在就说明当前事务为提交,此版本的数据不可见;如果当前事务id小于活跃事务id集合的最小id,就说明当前事务已经提交了,该版本的数据是可见的;如果当前事务id是大于等于预分配的事务id,也就是当前事务是此Read View生成后的未来事务,那么也是不可见的。快照读在读取时不会加锁,是乐观锁的态度,依靠MVCC来进行并发控制,也就是使用普通的select语句,可能会读到历史数据。头部是最新的数据,尾部是最旧的数据。

2025-03-03 15:47:10 158

原创 redo log和undo log是什么?

而引入了redo log后可以解决这个问题,当我们增删改时,会先操作buffer pool,然后redo log buffer会把这些数据记录下来,然后马上写到磁盘中的redo log日志文件中,这样之后数据从buffer pool同步到磁盘中时就算发生了错误,也可以从redo log日志文件中恢复。当我们对数据库进行增删改操作时,会先去操作内存中的buffer pool(缓冲池),然后再刷到磁盘当中,如果刷盘的过程中数据库宕机了,那么内存中的数据是有可能丢失的。

2025-03-03 12:31:09 302

原创 事务的四大特性和隔离级别

不可重复读:一个事务中先后两次读取同一条记录,但是在这期间这条记录被另一个事务更改了,那么这两次读取出来的数据就是不同的,这称为不可重复读。脏读:一个事务去改变了数据,但这个事务还未提交,这个数据却被另一个事务读到了,那么这个数据就是脏数据,因为事务是有可能回滚的,这就是脏读的问题。事务的隔离级别是由小到大分别是读未提交,读已提交,可重复读,串行化,它们是为了解决并发事务的脏读,不可重复读,幻读的问题。隔离性:并发事务之间是隔离的,互不影响的,这与事务的隔离级别有关。

2025-03-03 09:58:51 98

空空如也

空空如也

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

TA关注的人

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