自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JUC-线程运行的原理

当运行一个java程序的时候,会把该类的字节码文件加载到内存中,放到方法区,java虚拟机会开启一个main主线程,并且给主线程分配一块线程栈内存,线程交给任务调度器调度执行,主线程的入口是main方法,会给main方法分配栈帧内存,每一个栈帧内存中都有局部变量表,参数,返回地址,锁记录,操作数栈,方法带参数,会把栈内存的参数,虚拟机创建一个对象放入堆中,把引用给了方法参数。其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。每个线程都会有线程栈内存,都会有一个程序计数器,会记录代码执行到了哪里。

2025-10-13 18:18:31 127

原创 天机学堂day11aop实现分布式锁添加获取锁失败逻辑

我们可以定义一个枚举类记录五种方式,在枚举类中定义一个抽象方法,五种方式分别实现对应的方法,代码如下。在自定义的tryLock注解中加入枚举类,通过注解参数明白到底用哪个策略。因为异常已经在策略中抛出了,最终返回的都是快速结束的直接结束就可以了。通过以上图片总结出了一共有五种分布式锁失败的策略。还有一个优化EnumMap的使用,效率高。

2025-10-07 22:32:21 167

原创 天机学堂day11aop方式实现分布式锁的代码优化

我们可以用一个map集合来,key作为枚举类型,value为一个函数,只要为他传入一个参数name就可以直接调用返回锁。在之前的代码中,我们只能获取可重入锁,但是在其他业务中我们还需要其他类型的锁。所以我们优化的一点就是在注解中加一个枚举类,来记录到底使用哪种锁。我们的增强代码也需要改造。

2025-10-03 21:10:24 160

原创 天机学堂day11基于aop实现分布式锁的获取与删除

注解的执行顺序是我们要考虑的,我们要防止事务失效,先获取锁在开启事务,所以要实现ordered接口,然后实现getOrder()方法,值越小越先执行就可以啦、获取锁在业务前面,释放锁在业务后面,我们可以想到用aop环绕增强来实现。切入点是带有mylock注解的方法,增强方法参数中获取注解中传入的参数。每次都得写锁的获取与释放,我们看下面业务逻辑。在其他业务也可能用到分布式锁。来自黑马程序员的天机学堂。

2025-10-03 20:12:56 129

原创 天机学堂day10高并发,超卖,一人多买,锁失效,事务失效 -part2

乐观锁显然不合适了,所以我们选用悲观锁,假如把synchronized加到方法上,其实我们锁的粒度太大了,锁的是全部用户,其实只要限制一个用户就行,所以我们可以用代码块,把用户的id作为锁,不同用户也锁不住。一个用户如果使用多个线程来并发访问,先查出一个人买了多少,如果多个线程查出了相同值,就会导致多买。用乐观锁,在更新的时候加一个条件判断数据库此时的库存是否等于之前查出来的库存。我们此时遇到的是非事务方法调用本类中的事务方法。先查后改,就会导致超卖问题。首先导入aspectj依赖。

2025-10-03 14:37:34 227

原创 天机学堂day10领取优惠劵-part1

4.查到之后,我们在后面封装vo的时候是对每一个优惠卷进行封装返回,所以我们可以通过stream流的方式,得到一个map集合,以优惠劵id作为key,用户与优惠劵的信息作为值,就是以优惠劵id作为分组,这样拿到的就是每一张该用户已领取的优惠劵,对应的该用户领取的信息,具体领取了几张呢,就放到一个集合中,我们要得到的是用户到底有没有超过领取限制,所以我们可以使用counting来统计每一个优惠劵用户领取了几张,也就得到了每一个优惠卷,对应每一个用户领取的数量。首先我们要从优惠劵表中查询已经发放的优惠劵。

2025-10-02 15:30:41 122

原创 天机学堂day8排行榜

但是我们考虑到我们的服务以后部署是集群模式的,定时任务会导致频繁执行,因为此定时任务是每个服务内部的,所以我们要选用xxljob在外部管理定时任务。首先考虑垂直分表,看看能不能将频繁写的字段分开,避免影响,如果不行考虑搭建主从集群,读写分离。用户id,分数,用户id,在redis利用zset存储的,所以id就是从大到小有序的。如果单个库的压力太大,再考虑分库,水平分库结合分表,实现数据分片。随着用户量的增加,数据库的存储压力变大,考虑到分区。1.如何在插入的时候,指定修改的表。数据库的读写压力大怎么办。

2025-09-28 17:07:01 212

原创 day06天机学堂点赞系统优化

这是以前的方案对于点赞业务,写的操作太多了,对数据库压力比较大每次点赞的数量变更,都要通过mq发消息,更改回答业务的点赞数量优化方案1.可以把点赞的具体业务id和用户id缓存到redis,采用redis的set数据结构,可以检验记录是否存在,不存在则增加,或者取消点赞则删除记录。2.如果新增或者删除成功,意味着点赞数量变化了,因为之前要频繁修改数据库,我们也可以缓存到redis中。3.最终要实现数据落库,我们可以用一个定时任务,定期处理redis中的点赞数量,因为是不同业务,我们可以配置热更新,把业务的类型

2025-09-24 15:38:01 186

原创 天机学堂处理高并发业务,day4保姆级

如果在第一次学完的时候把数据库的finished字段改为true,但是redis中的字段还是false,会导致,下一次重复小节数量加1,所以也要更新缓存,但是如果是更新缓存,在有错误的时候,触发了回滚,finished本来改为了true,回滚为false,但是redis中回滚不了,又会导致数据不一致,所以要清理redis缓存,即使回滚redis数据也被删除了,不会导致数据不一致性。如果使用第一种,可以保证数据一致性,那么我们的业务仅仅是简单的更新学习记录的时间不涉及到复杂的业务,所以我们选择第二种方式。

2025-09-19 12:32:06 697

原创 黑马点评封装工具类代码简化

我是根据泛型来的,虎哥是Object data。希望可以帮到正在学redis的你。

2025-06-04 23:46:30 187

原创 黑马点评 查询商品类型用string实现

【代码】黑马点评 查询商品类型用string实现。

2025-06-02 15:54:33 129

原创 StringBuilder类

字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变化的字符串)StringBuilder在内存中始终是一个数组,占用空间少,效率高。字符串的底层是一个被final修饰的数组,不能改变,是一个常量。"ab"+"c" "abc"一个字符串。底层也是一个数组,但是没有被final修饰,可以改变长度。"a"+"b" "ab"一个字符串。进行字符串的相加,内存中就会有多个字符串,占用空间多,效率低下。String s "a","b","c"三个字符串。字符串是常量,他们否值在创建之后黁修改。

2025-02-14 17:27:46 194

原创 Object类(无需导包)

java.lang.Object类是java语言中的根类,既所有类的父类。他中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。比较两个对象是否相同但是加了一些判断。重写之前:打印的是包名类名@地址值。重写之后:打印的是对象中的属性值。重写后:比较的是对象中的属性值。该类提供了一些非常常用的方法。重写前:比较对象的地址值。1.equals()方法。1.object类介绍。作用:打印对象的信息。3.equals方法。二,Objects类。

2025-02-09 22:01:09 226

原创 滑动窗口求一个字符串中最长的不重复的子串的长度

【代码】滑动窗口求一个字符串中最长的不重复的子串的长度。

2025-01-25 15:10:00 112

原创 移动窗口算法,数组内元素和大于target的最小子串

【代码】移动窗口算法,数组内元素和大于target的最小子串。

2025-01-25 11:56:10 138

原创 最小覆盖子串

【代码】最小覆盖子串。

2025-01-24 23:32:34 90

原创 归并排序代码

【代码】归并排序代码。

2025-01-21 22:11:39 106

原创 蓝桥杯拉马车

拉马车。

2025-01-19 22:04:35 353

原创 String类和StringBuilder类的方法和区别

indexOf(),lastIndexOf() 如果String并不包含此参数,就返回-1,否则就返回参数在String中的起始索引。concat() 返回一个新的String对象,内容为原始String连接上参数string。equals(),equalsIgnoreCase() 比较两个String的内容是否相等。substring() 参数:起始索引+终点索引(不包括),返回一个新String。replace() 参数:要替换掉的字符,用来进行替换的新字符。String类的方法。

2025-01-19 22:00:43 865

原创 蓝桥杯分巧克力

例如一块 6×56×5 的巧克力可以切出 66 块 2×22×2 的巧克力或者 22 块 3×33×3 的巧克力。以下 N 行每行包含两个整数 Hi,WiHi​,Wi​ (1≤Hi,Wi≤1051≤Hi​,Wi​≤105)。小明一共有 NN 块巧克力,其中第 ii 块是 Hi×WiHi​×Wi 的方格组成的长方形。当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?第一行包含两个整数 N,KN,K (1≤N,K≤1051≤N,K≤105)。输出切出的正方形巧克力最大可能的边长。

2025-01-18 21:41:28 337

原创 蓝桥杯k倍区间问题

给定一个长度为 N 的数列,A1,A2,⋯AN,如果其中一段连续的子序列 Ai,Ai+1,⋯AjAi​, ( i≤j) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?

2025-01-17 19:57:14 554

原创 蓝桥杯回文字符串

小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 S,小蓝可以往字符串 S 的开头处加入任意数目个指定字符: l、q、b(ASCIIASCII 码分别为: 108、113、98)。若遇到需要添加的,从最后开始找的时候必须是与l,q,d相等的字符才可以、若遇到不是l,q,d其中的并且也不等于left所指向的就返回一个false。输出 TT行,每行包含一个字符串,依次表示每组数据的答案。输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。每组数据一行包含一个字符串 SS。

2025-01-16 14:45:32 372

原创 蓝桥杯“好数”题目

一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。算法核心:这个算法的核心是通过奇数位数和偶数位数的和是否等于总位数,如果等于总位数,那么这个数就是好数。给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。N可以取1到10的7次。

2025-01-15 12:12:33 319 1

空空如也

空空如也

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

TA关注的人

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