- 博客(139)
- 收藏
- 关注
原创 【源码分析】从源码角度分析shutdown和shutdownNow
shutdown会检查当前线程的状态,如果当前线程是空闲的那么就会调用interrupt方法进行终止线程shutdownNow会向所有的线程发送终止信号,但是会调用将任务队列中尚未执行的任务全部取出并返回,避免这些任务被执行,同时让调用者知道哪些任务被丢弃。而上述的都是通过调用interrupt方法来去终止线程的,但是interrupt并不会立即关闭线程,它只是一个中断信号,如何处理中断取决于线程的具体实现和代码逻辑。
2025-02-21 16:45:01
685
原创 【Java基础】静态多态和动态多态
多态是面向对象编程(OOP)中的核心概念之一,它指的是。,并保持方法签名(方法名、参数类型、参数个数)不变。在 Java 中,多态主要有。
2025-02-17 16:35:28
451
原创 【MQ】RabbitMq的可靠性保证
镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节 点,如果主节点宕机后,镜像节点会替代成新的主节点。我们可以通过仲裁队列来进行解决,和镜像队列一样,都是主从模式,支持主从数据同步但是不一样的点就是。在镜像队列主从同步的过程中,会出现在主从同步完成前,主节点就已经宕机,可能出现数据丢失。确保消费者成功处理消息之后,mq才会将消息从消息队列中删除,避免消息丢失。当消息处理失败的时候,通过重试机制重新投递消息,确保消息最终被成功处理。需要处理异常消息的场景,如消息重试,失败信息分析等。
2025-01-25 18:31:51
1788
原创 【Mysql】记录锁、间隙锁和临键锁的区别
InnoDB中的行锁的实现依赖于索引,一旦某个加锁的操作没有用到索引就会退化到表锁记录锁存在在于包括主键索引在内的唯一索引,锁定单条索引记录间隙锁存在于非唯一索引,锁定开区间的一段间隔,它是基于临键锁实现的临键锁存在于非唯一索引,该类型每条记录的索引都会存在这个锁,锁定一段左开右闭的索引区间。
2025-01-23 18:19:05
671
原创 【数据库】Update两阶段提交
所以在MySQL5.7版本中,做了个改进,在prepare阶段不再让事务各自执行redolog刷盘操作,而是推迟到组提交的flush阶段,也就是说prepare阶段融合在了flush阶段。,每个阶段都有锁进行保证事务写入的顺序性,第一个进入队列的事务会成为leader,leader领导所在队列的所有事务,全权负责整队的操作,完成后通知队内其他事务操作结束。,两阶段提交其实是解决分布式事务一致性协议的,它可以保证多个逻辑操作,要不成功,不要全都失败,不会出现半成功半失败的情况。
2025-01-20 15:56:15
1420
原创 【网络】DNS解析流程
DNS全称叫做域名系统。DNS域名主要是通过来进行分割层级的,越往后层级级别越大(符合外国人起的名称)我们访问的url如:www.baidu.com其实在最后还有一个->www.baidu.com. 最后一个点代表在最顶层,下一层就是,在下面就是。
2025-01-16 18:38:13
353
原创 Update和Insert是锁表还是锁行
Update和Insert是锁表还是锁行,会影响到程序中并发程序的设计。(1)Update时,where中的过滤条件列,如果用索引,锁行,无法用索引,锁表。按照索引规则,如果能使用索引,锁行,不能使用索引,锁表。(2)Insert时,可以并发执行,之间并不会相互影响。
2025-01-15 17:09:29
623
原创 【K8S】快速入门Kubernetes
之前企业都是使用容器化和来构建自己的服务和应用程序,其中容器化优点有很多:提升了部署效率、稳定性、提高了资源的利用率降低了成本。但是也带来了一些新的问题:容器的数量变得很多,管理就是一个新的问题。所以Kubernetes就出现了,用于管理容器化引擎的部署、扩展和管理等等。
2024-10-22 18:38:31
1100
原创 【Go进阶】协程的创建以及通信
轻量级:协程是一种非常轻量级的执行单元,相比传统的操作系统线程,协程的创建和切换开销非常小。创建一个协程只需要几 KB 的栈空间,而操作系统线程通常需要几 MB 的栈空间。这使得在 Go 语言中可以轻松创建大量的协程,而不会给系统带来沉重的负担。并发性:协程允许在一个程序中同时执行多个任务,实现并发执行。多个协程可以在同一个进程中并发地执行,共享进程的内存空间和资源。这使得并发编程更加高效和灵活。非阻塞式执行:协程可以在等待某个操作完成时(如网络 I/O、文件读取等)暂停执行,而不会阻塞整个程序的执行。
2024-10-14 17:05:04
941
原创 【Go初阶】两万字快速入门Go语言
快速入门Go语言,看这一篇文章就完全够了,覆盖了Go的绝大部分使用方法和场景,让你快速入门Go语言的基础语法以及基础使用!!!
2024-10-14 15:08:15
1281
原创 【框架篇】过滤器和拦截器的区别以及使用场景
这样做的好处是,在获取MyInterceptor实例时,由于getMyInterceptor方法是由 Spring 容器管理的(因为它在@Configuration类中),Spring 会确保在创建MyInterceptor实例时,相关的依赖(如可能需要注入的 Service)已经被正确初始化。拦截器是链式调用的,一个应用中可以存在多个拦截器,一个请求可以触发的多个拦截器,并且每一个拦截器按照声明的顺序依次执行。
2024-10-02 18:23:59
1364
1
原创 【Redis】如何解决Redis并发量大的安全访问
我们在使用 Redis 时,不可避免地会遇到并发访问的问题,比如说如果多个用户同时下单,就会对缓存在 Redis 中的商品库存并发更新。一旦有了并发写操作,数据就会被修改,如果我们没有对并发写请求做好控制,就可能导致数据被改错,影响到业务的正常使用(例如库存数据错误,导致下单异常)。为了保证并发访问的正确性,Redis 提供了两种方看上去好像是一种很好的方案,但是,其实这里会有两个问题:一个是,如果加锁操作多,会降低系统的并发访问性能;
2024-09-26 15:07:20
1304
原创 【RabbitMQ】RabbitMq消息丢失、重复消费以及消费顺序性的解决方案
主要就是一个幂等性的一个问题(无论是一个操作执行多少次,产生的结果合执行一次是相同的),解决方案有几个方面:数据库层面、业务层面、分布式系统层面。主要是有三种情况:生产者消息未发送到服务端、服务端消息没有做持久化导致丢失、消费端未收到消息。,主要有以下几个层面来解决:生成者层面,消费队列层面、消费者层面。
2024-09-25 22:55:48
1248
原创 【框架】Spring、SpringBoot和SpringCloud区别
例如,一个对象 A 需要依赖对象 B 来完成某些功能,那么对象 A 就会在自己的代码中显式地创建对象 B。这样的方式会导致对象之间的耦合度较高,当对象 B 的实现发生变化时,可能需要修改对象 A 的代码。而在 IoC 的设计模式下,对象的创建和依赖关系的注入由一个外部的容器(通常称为 IoC 容器)来负责。SpringBoot是为了简化Spring开发的框架(具体体现就是说Spring创建一个代码需要配置对应的Bean和MVC(xml文件)但是SpringBoot无需配置)主要的一个特点就是。
2024-09-21 22:03:13
1562
原创 【面试题】如何合理的设置线程池中的参数
采用默认通常能满足。实际情况要根据机器性能来调整,如果在未达到最大线程数的情况机器 CPU load 已经满了,则需要通过升级硬件和优化代码,降低。最大线程数在生产环境上往往设置成与核心线程数一样,这样可以减少在处理过程中创建线程的开销。根据具体情况来决定任务拒绝策略,任务不重要可丢弃,任务重要则要利用一些缓冲机制来处理。
2024-09-21 15:14:56
874
原创 关于es的一个多集群、多索引切换的实现
首先封装三个对象一个是关于es集群的对象包括集群名称、该名称下的节点,还有一个索引表存储集群名称和索引的。然后通过@PostConstruct这个注解来实现提前注入,获取到存储集群名称和节点的对象放到RestHighLevelClient这个对象中,将其存储一个map中,后续操作我们只是需要通过get集群名称就可以获取到这个对象了。而对应的对应的索引的切换只需要,通过传入一个EsIndexInfo对象,存储的集群名称和索引,就可以进行具体的操作了。
2024-09-21 12:08:23
699
原创 一篇文章介绍清楚什么是阻塞/非阻塞IO和IO多路复用
只能执行受限的命令,而且不能直接调用系统资源,必须通过内核提供的接口来访问可以执行特权命令,调用一切系统资源Linux系统为了提高IO,要把用户缓冲数据拷贝到内核缓冲区,然后写入设备,要从设备读取数据到内核缓冲区,然后拷贝到用户缓冲区。
2024-09-16 15:28:18
1027
原创 【Bean】BeanPostProcessor的前置方法和后置方法的作用和使用
总之,前置处理器在 Spring 中起着非常重要的作用,可以在 Bean 的实例化前后进行自定义的处理操作,从而实现对 Bean 的灵活管理和增强。是一个非常重要的接口,用于在 Spring 容器实例化、初始化 Bean 的前后进行自定义的处理操作。而前置处理器(实现了。的 Bean 初始化前后打印了相应的信息,并且可以在方法中对 Bean 进行修改等操作。在 Spring 中,在这个例子中,自定义的。
2024-09-15 16:32:54
807
原创 【面试题】什么是代理以及如何实现代理
在 Spring 中,动态代理是在运行时动态地生成代理对象的一种机制。与静态代理不同,动态代理不需要为每个目标对象都手动创建一个代理类,而是根据目标对象的类型和需要添加的额外逻辑,在运行时自动生成代理对象。它需要手动创建代理类,代理类实现与目标对象相同的接口,并在代理类中调用目标对象的方法,同时可以在调用前后添加额外的逻辑。在 Spring 中,代理主要用于实现 AOP(面向切面编程),它是一种在不修改目标对象代码的情况下,为目标对象添加额外功能的机制。
2024-09-14 14:25:29
651
原创 【设计模式】单例模式
例如,在一个操作系统中,打印机的驱动程序通常可以设计为单例模式。因为在整个系统中,只需要一个打印机驱动程序的实例来管理与打印机的通信和操作,多个应用程序可以共享这个实例来进行打印任务,避免了为每个应用程序都创建一个独立的驱动程序实例所带来的资源浪费。单例模式的主要目的是限制一个类的实例化次数,只允许创建一个对象。这样可以在整个应用程序中共享同一个实例,从而减少资源消耗、提高性能,并方便对共享资源的管理和控制。单例模式是一种常见的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。
2024-08-18 18:12:12
1148
原创 【每日面经】快手面经
因为之前我们所说的锁他都是在本地jvm实现的锁,一个JVM只可以持有一把锁,但是分布式的场景之下一个请求可能是多个服务发过来的(例如:8001端口,8002端口....都发来了请求),这样的话每一个服务都是有自己jvm的,就会出现多个服务都持有锁的情况,这样普通的锁是不能保证线程安全的问题的。,作用是在并发的环境下,线程是交替执行的,线程A可能执行一半,开始执行线程B,当再次执行线程A的时候会按照上次执行的位置来执行,这个就是程序计数器的作用,指向当前线程执行的行号。双亲委派机制是类加载器的一个加载方式。
2024-08-10 19:57:43
1124
原创 【每日面经】字节面经
这些不同的隔离级别可以解决Mysql在并发的时候引出的脏读、不可重复读和幻读的问题。MVCC又叫做多版本并发控制,它会记录一个数据的多个版本,是的读写没有冲突,根据内部的匹配规则和当前的一些事务id来决定读取的数据是哪一个版本的。使用explain/desc+select语句就可以出现一张表,看其中的key(当前sql实际命中的索引)和key_len(索引占用的大小)字段。例如:公共日志的实现、事务的管理。条件中的字段在一个联合索引中,并且查询条件能够匹配联合索引的最左前缀部分,那么仍然可能使用索引。
2024-08-07 13:37:42
931
原创 【JVM】垃圾回收机制、算法和垃圾回收器
关于JVM中垃圾回收的所有知识都整理到这一篇文章了,如果你有关于JVM中垃圾回收的流程和原理不理解的,那么看这一篇文章就完全足够了!!!
2024-08-02 20:36:06
1573
原创 【JVM】类加载器和双亲委派模型
如果想要了解什么是类加载器就需要清楚一个Java文件是如何运行的。我们可以看下图:类加载器把Java代码转换为字节码文件运行时数据区将字节码文件加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层操作系统来执行,而是需要有执行能力的执行引擎来运行执行引擎将字节码翻译为底层系统指令,再交给CPU来执行,而这个时候需要调用其它语言的本地库接口来实现整个程序的功能JVM只会运行二进制文件,而类加载器(ClassLoader)的主要作用就是将字节码文件加载到JVM。
2024-08-01 18:32:56
1274
原创 【JVM】JVM的组成与执行流程
全网关于JVM的组成和运行原理最清楚的一篇文章,如果你对JVM组成和运行流程有问题看这一篇文章完全能解决你的问题
2024-07-31 18:00:52
1170
原创 【面试题】关于HashMap的put导致循环链表问题
HashMap 死循环发生在 JDK 1.7 版本中,形成死循环的原因是 HashMap 在 JDK 1.7 使用的是头插法,头插法 + 多线程并发操作 + HashMap 扩容,这几个点加在一起就形成了 HashMap 的死循环,解决死循环可以采用线程安全容器 ConcurrentHashMap 替代
2024-07-28 19:38:54
903
原创 【面试题】MVCC多版本并发控制
其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段, 第二个是undo log日志,第三个是readView读视图隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事 务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回 滚指针),指向上一个版本的事务版本记录地址。
2024-07-17 21:54:31
987
原创 【面试题】Redo log和Undo log
具体流程就是,当发生增删改的时候,首先会修改buffer pool中的数据,而redo log buffer会记录里面的数据页的变化,一旦日志出现了变化,就会同步到磁盘中的重做日志文件,当发现buffer pool同步数据失败的时候,可以通过日志来同步数据。是可以的,但是会出现性能的问题,当大量的增删改的sql发过来的时候,内存到磁盘的同步是随机的磁盘的io,这样的性能是很低的。(首先会判断是否有操作的数据,如果没有从磁盘中加载),因为直接操作内存的性能会比操作磁盘的性能更加高,然后将。
2024-07-17 16:38:04
1098
原创 【面试题】手撕缓存LRU
设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能。综上所述:对于一个LRU缓存来说,主要包含以下三种操作。
2024-07-15 17:48:11
418
原创 【并发】Synchronized的底层原理
当线程到来的时候,线程首先会判断Monitor中的Owner是否为空,如果为空则当前线程就会持有锁,如果不为空,那么当前线程会进入导EntryList中进行等待,此时里面的线程出于Blocked的状态,当Owner为空的时候,这些阻塞的线程就会争抢Owner;而其中的WaitSet是存储的调用wait方法的等待的线程,就是处于Waiting状态的线程。在很多的情况下,在Java程序运行的时候,同步块中的代码都是不存在竞争的,不同的线程交替的执行同步代码块。其中对象头对于锁升级的关系是很大的。
2024-06-05 17:32:52
717
原创 【场景题】如何排查CPU偏高的问题
所以我们需要找到是哪一个代码导致的这样的情况,由于代码是线程执行的,而线程是进程的执行的最小单元,所以我们需要在当前的进程找到哪一个线程执行的代码,来定位这个问题2。由此可以看见是这个线程下的代码第九行报错了,所以我们需要在Application.java文件中找一下第九行代码看一下。可以看见是进程id为2266的进程里面的java程序,占用了CPU90%使用情况。为了解决CPU偏高的问题,我们首先看一下每一个进程的CPU占用情况,使用命令。由此可以看到是2266进程下的2276线程占用的CPU。
2024-06-04 20:33:03
506
原创 HashMap的get和put方法
在 JDK 1.8 中,HashMap是一个常用的实现了Map接口的哈希表,它允许存储键值对,并且键和值都可以为 null。HashMap的主要特点是其基于哈希表的实现,提供了快速的查找和插入操作。以下是HashMap中get和putput。
2024-06-03 17:39:40
595
Java面试题-并发.docx
2024-02-18
Java面试题-哈希.docx
2024-02-18
Java面试题-基础和集合.docx
2024-02-18
面试day1-基础.docx
2024-02-18
RaabbitMQ文件
2024-02-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人