- 博客(32)
- 收藏
- 关注
原创 八股问---集合(2)
如果把上面的执行用一句话归纳的话,就相当于是ConcurrentHashMap通过对头结点加锁来保证线程安全的,锁的粒度相比 Segment 来说更小了,发生冲突和加锁的频率降低了,并发操作的性能就提高了。而且JDK1.8 使用的是红黑树优化了之前的固定链表,那么当数据量比较大的时候,查询性能也得到了很大的提升,从之前的 O(n) 优化到了 O(logn)的时间复杂度。当触发扩容时,HashMap 会创建一个新的数组,其大小是原来的 2 倍,并将原数组中的元素重新映射到新数组中,这个过程叫 rehash。
2025-05-26 17:40:12
1302
原创 八股文---集合(1)
双列集合一次需要存一对数据,分别为键和值键不能重复,值可以重复键和值是一一对应的,每一个键只能找到自己对应的值键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象。
2025-05-26 17:37:01
1095
原创 AOP的代理模式
对于这一点,jdk代理是采用反射,你看,我都反射了,我还拿不到你的原始方法?直接获取到Method类,再放入特定的上下文环境,也就是AOP通知,调用invoke方法即可。而cglib代理是怎么获得原始方法的呢,它的代理类是继承目标类的,那都直接继承目标类了,那不就可以直接通过super.的形式调用目标类的原始方法。
2025-05-23 19:58:10
532
原创 八股--SSM(2)
1.直接在Select语句中增加数据库提供的分页关键字,然后在应用程序中传递当前页和每页展示页数2.Mybatis中提供的RowBounds对象,实现内存级别分页3.基于Mybatis里面的Interceptor拦截器,在Select语句执行之前动态拼接关键字Mybatis 在处理 #{} 时,会创建预编译的 SQL 语句,将 SQL 中的 #{} 替换为 ? 号,在执行 SQL 时会为预编译 SQL 中的占位符(?)赋值,调用 PreparedStatement 的 set 方法来赋值,预编译的 SQL
2025-05-23 19:55:44
1171
原创 八股文--JVM(2)
3.当Eden(伊甸园区)需要垃圾回收时,挑出一个空闲区域作为S(幸存区)区,用复制算法复制存活对象,这时候处于STW(线程暂停)5.将Eden(伊甸园区)以及之前幸存区中的存活对象,采用复制算法,复制到新的S(幸存区),其中较老的对象晋身老年代。,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于"
2025-05-20 21:18:40
1243
原创 天机学堂项目面试回答
我这个项目是基于微服务架构的生产级在线教育项目,面向成年人的非学历职业技能培训平台。分为两部分,学生端:其核心业务主体就是学员,所有业务围绕着学员的展开。管理端:其核心业务主体包括老师、管理员、其他员工,核心业务围绕着老师展开。在领取优惠卷的时候因为我们领取的整个业务外面加了事务,而加锁的是其中的限领数量校验的部分。因此业务结束时,会先释放锁,然后等整个业务结束,才会提交事务。这就导致我们测试的时候还有出现超领。为了解决这个问题,我们将事务的范围缩小,保证了事务先提交,再释放锁,最终线程安全问题不再发生了。
2025-05-20 21:14:30
981
原创 深入理解Java中的Minor GC、Major GC和Full GC
Minor GC、Major GC和Full GC在Java垃圾回收机制中扮演着不同的角色,它们各自有着明确的作用范围、触发条件和特点。理解它们之间的区别和联系,对于优化Java应用程序的内存管理、提高应用程序的性能至关重要。在实际开发中,我们可以根据应用程序的特点和需求,合理选择垃圾回收器,并通过调整相关参数,来尽量减少Full GC的发生,降低垃圾回收对应用程序性能的影响。希望通过这篇博客,大家能对Java中的这三种GC有更深入的理解,在处理Java内存相关问题时能够更加得心应手。
2025-05-18 13:46:15
1392
原创 项目复习(2)
1.直接把需要的字段用.select(InteractionQuestion::getId.......)可以先把问题表的属性赋值了,最后一块修改数据库,不要多次查询修改。基于Redis数据结构模拟JDK的DelayQueue实现。例如RabbitMQ的死信队列。JDK自带延迟队列,基于阻塞队列实现。和上面的分页一模一样。
2025-05-17 19:47:17
847
原创 八股文--JVM(1)
直接内存:并不属于JVM的内存结构,不由JVM进行管理,是虚拟机的系统内存,常见与NIO操作时,用于数据缓冲区,他分配回收成本较高,但读写性能高。
2025-05-16 16:31:22
1257
原创 八股文--JUC(2)
ReentrantLock翻译过来是可重入锁,相对于synchronized它具备以下特点:可中断(可以主动放弃)可以设置超时时间可以设置公平锁支持多个条件变量与synchronized一样,都支持重入。
2025-05-16 16:29:46
1243
原创 八股文---消息队列
例如,像 RabbitMQ 可以通过配置将消息持久化到磁盘,通过将队列和消息都设置为持久化的方式(设置durable = true),这样在服务器重启后,消息依然可以被重新读取和处理。例如,在第一次处理失败后,等待一段时间(如 5 秒)后进行第二次重试,如果重试多次(如 3 次)后仍然失败,可以将消息发送到死信队列,以便后续人工排查或者采取其他特殊处理。:消息队列生产者为每条消息生成唯一的消息 ID,消费者在处理消息前,先检查该消息 ID 是否已经处理过,如果已经处理过则丢弃该消息。
2025-05-15 09:43:05
715
原创 八股文---JUC(1)
这个是在偏向锁开启之后的锁的状态,如果还没有一个线程拿到这个锁的话,这个状态叫做匿名偏向,当一个线程拿到偏向锁的时候,下次想要竞争锁只需要拿线程ID跟MarkWord当中存储的线程ID进行比较,如果线程ID相同则直接获取锁(相当于锁偏向于这个线程),不需要进行CAS操作和将线程挂起的操作。:这是没有开启偏向锁的时候的状态,在JDK1.6之后偏向锁的默认开启的,但是有一个偏向延迟,需要在JVM启动之后的多少秒之后才能开启,这个可以通过JVM参数进行设置,同时是否开启偏向锁也可以通过JVM参数设置。
2025-05-15 09:41:09
1022
原创 八股文---框架SSM(1)
AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。记录操作日志缓存处理Spring中内置的事务处理回答面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合。
2025-04-22 18:22:29
710
原创 八股文---Redis(2)
回答:单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。一般都是一主多从,主节点负责写数据,从节点负责读数据3.1.2.能说一下,主从同步数据的流程回答1.从节点请求主节点同步数据(replication id、 offset )2.主节点判断是否是第一次请求,是第一次就与从节点同步版本信息(replication id和offset)3.主节点执行bgsave,生成rdb文件后,发送给从节点去执行。
2025-04-21 19:17:57
1188
原创 SpringAi与大模型在项目中的应用(1)
这是因为⼤模型是没有记忆的,因此我们调⽤API接⼝与⼤模型对话时,每⼀次对话信息都不会保留, 多次对话之间都是独⽴的,没有关联的。例如,有的模型可以根据⾳频⽣成⽂本,或者根据⽂本⽣成⾳频,还有的模型则可以根据⽂字⽣成图⽚,⽐如Dall-E、MidJourney。⾸先,我们需要下载⼀个Ollama的客⼾端,在官⽹提供了各种不同版本的Ollama,⼤家可以根据⾃⼰的需要下载。因此,不同的⼤模型由于System设定不。根据前⽂推测出接下来的⼀个词语后,把这个词语加⼊前⽂,再次交给⼤模型处理,推测下⼀个字,
2025-04-13 21:56:39
1325
原创 BitMap的使用(1)
当我们做项目的时候肯定遇到过签到功能吧,如果用平常数据库,假如一个用户1年签到100次,而网站有100万用户,就会产生1亿条记录。随着用户量增多、时间的推移,这张表中的数据只会越来越多,占用的空间也会越来越大。有没有什么办法能够减少签到的数据记录,减少空间占用呢?大家回忆一下,小时候上补习班时的签到卡:在这张小小的卡片上面,就记录了从一个月的第一天到最后一天的所有的签到情况。诶,你今天来上课了那就勾一下,没来就空着。这样呢,通过一个小小的卡片就能够记录一个同学这一个月的签到的情况了。
2025-04-07 16:09:37
1201
原创 Redis分布式锁(2)
小总结:利用set nx ex获取锁,并设置过期时间,保存线程标示释放锁时先判断线程标示是否与自己一致,一致则删除锁特性:利用set nx满足互斥性利用set ex保证故障时锁依然能释放,避免死锁,提高安全性利用Redis集群保证高可用和高并发特性我们一路走来,利用添加过期时间,防止死锁问题的发生,但是有了过期时间之后,可能出现误删别人锁的问题,这个问题我们开始是利用删之前 通过拿锁,比锁,删锁这个逻辑来解决的,也就是删之前判断一下当前这把锁是否是属于自己的,但是现在还有原子性问题。
2025-03-28 21:12:59
1057
原创 Redis分布式锁(1)
我们利用redis 的setNx 方法,当有多个线程进入时,我们就利用该方法,第一个线程进入时,redis 中就有这个key 了,返回了1,如果结果是1,则表示他抢到了锁,那么他去执行业务,然后再删除锁,退出锁逻辑,没有抢到锁的哥们,等待一定时间后重试即可。Mysql:mysql本身就带有锁机制,但是由于mysql性能本身一般,所以采用分布式锁的情况下,其实使用mysql作为分布式锁比较少见。只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路。
2025-03-28 20:53:58
279
原创 Redis中缓存更新,缓存穿透,缓存雪崩,缓存击穿
假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把重建数据构建完后,其他线程才能走返回正确的数据。
2025-03-27 14:43:52
1278
原创 推荐的几个软件/插件
你肯定有这样的烦恼,设计好数据库还得设计DTO,PO,VO,实体类吧,还有什么controller,mapper,service等包名吧。这似乎很麻烦,而且不需要什么技术含量。
2025-03-20 19:04:14
499
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人