自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 流程图实例

2025-04-24 15:59:44 154

原创 TableGo使用

实习过程中被推荐使用了TableGo。

2024-12-16 22:16:04 457

原创 beanutils.copyproperties工具类的使用

【代码】beanutils.copyproperties工具类的使用。

2024-12-16 21:50:01 289

原创 死锁相关及具体应用

进程在运行过程中,请求和释放资源的顺序不当。例如,并发进程 P1、P2分别保持了资源R1、R2,而进程P1申请资源R2,进程P2申请资源R1时,两者都会因为所需资源被占用而阻塞。 信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,结果也会使得这些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A 发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。 可以使用JVM死锁排查工具,jsp查找程序的运行端口,jstack

2024-10-08 21:38:11 423

原创 不同场景下解决超卖的方式

首先我们要为 tb_seckill_voucher 表新增一个版本号字段 version ,线程1查询完库存,在进行库存扣减操作的同时将版本号+1,线程2在查询库存时,同时查询出当前的版本号,发现库存充足,也准备执行库存扣减操作,但是需要判断当前的版本号是否是之前查询时的版本号,结果发现版本号发生了改变,这就说明数据库中的数据已经发生了修改,需要进行重试(或者直接抛异常中断)由于乐观锁是判断数据是否修改的,而当前情况的重点是判断当前是库存否存在,所以无法像解决库存超卖一样使用CAS机制,因此使用悲观锁。

2024-09-27 22:37:22 1404

原创 spring的循环依赖多种解决方案

Spring 中的循环依赖是指两个或多个 Bean 之间相互依赖,就是说两个或多个Bean相互之间的持有对方,比如A引用B,B引用C,C引用A,形成一个类似于死锁的循环引用的情况。

2024-09-23 12:29:36 430

原创 实现线程安全的单例模式相关

它涉及到多线程环境下的程序设计。当多个线程可以同时访问和修改共享数据时,如果这些操作不会导致数据的不一致或者错误结果,那么这个程序就是线程安全的。单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。懒汉式和饿汉式的区别是什么?在懒汉式中,对象的实例在首次被调用时才会被创建。饿汉式中,对象的实例在类加载的时候就被创建。

2024-09-21 20:39:38 410

原创 面试:多线程顺序打印

在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。比如说:使用join方法,T3调用T2,T2调用T1,这样就能确保T1就会先完成而T3最后完成。定义三个类,分别实现Runnable接口,每个类将表示一个线程。这三个类需要重写run()方法,并在其中添加逻辑。

2024-09-20 22:37:04 337

原创 高并发下保证接口幂等性的策略(数据一致性)

当线程1在查询缓存且未命中,此时线程1查询数据,查询完准备写入缓存时,由于没有加锁线程2乘虚而入,线程2在这期间对数据库进行了更新,此时线程1将旧数据返回了,出现了脏读,这个事件发生的概率很低,因为先是需要满足缓存未命中,且在写入缓存的那段事件内有一个线程进行更新操作,缓存的查询很快,这段空隙时间很小,所以出现脏读现象的概率也很低。当线程1删除缓存到更新数据库之间的时间段,会有其它线程进来查询数据,由于没有加锁,且前面的线程将缓存删除了,这就导致请求会直接打到数据库上,给数据库带来巨大压力。

2024-09-20 22:19:03 1656

原创 RabbitMQ实现对秒杀步骤的异步解耦

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。AMQP 基于TCP协议之上再次封装的协议,AMQP定义了合适的服务器端域模型,规范服务器的行为(AMQP的服务器端称broker)

2024-09-18 19:06:26 1271

原创 自定义布隆过滤器解决缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,导致数据库压力提高,造成宕机。缓存穿透就是指用户访问那些在数据库和Redis中都不存在的数据,例如我们知道id采用自增策略,那么就不可能出现负数id,而如果不法分子使用负数id进行查询,那么这些请求都会穿过Redis直接向数据库发送请求,从而导致数据库压力骤增,导致数据库宕机。缓存空对象实现简单,维护方便;额外的内存消耗,可能造成短期的不一致布隆过滤内存占用较少,没有多余key;

2024-09-14 22:43:44 853

原创 基于 Redisson 和 lua 脚本实现可重入锁

可重入锁是一种线程同步机制,它允许一个线程在释放锁之前可以再次获取同一锁。这种特性在多线程编程中非常有用,尤其是在需要递归调用的场景下。在高并发的情况下,为了防止出现超卖问题,需要保证一个线程获取锁和释放锁的操作具有原子性,解决方案之一就是使用Lua脚本。

2024-09-14 22:06:54 1333

原创 面试:位运算实现加法

:将上述找到的相同位置为 1 的位元向左移动一位,相当于将它们对应的值相加时产生的进位。相同位置上位元不同(即相异)的位置,并将结果存入。这一步相当于进行“无进位”加法。相同位置上位元都为 1 的位置。二进制每一位全1为1,否则为0。二进制每一位不同为1,相同为0。

2024-09-12 19:42:02 211

原创 JetCache 基于 Redis 和 Caffeine 做多级缓存

JetCache是一个基于Java的高性能、高可用的分布式缓存系统,它提供了内存级别的缓存服务。JetCache在设计上借鉴了Redis的一些特性,并且针对大规模应用环境进行了优化,支持多种数据结构和操作,同时具备高并发、低延迟的特点。

2024-09-11 21:30:09 1196

原创 springboot类项目细节

全局异常处理器;分布式session实现登录;

2024-09-08 21:31:53 261

原创 集合相关场景

根据年龄对学生对象集合排序;根据学号和年龄对学生集合去重;

2024-09-06 11:45:57 502 1

空空如也

空空如也

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

TA关注的人

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