Java 基础
文章平均质量分 66
Java 基础
锦还之路
敢于想象,多去经历,把学习时间花在难的地方,跳出舒适圈;
反思总结,多写文字,提高自己的表达能力,同样的内容写的更好。
展开
-
【八股文系列】Java并发
同一个object中多个方法都加了synchronized关键字的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法,即同步的,阻塞的;此结论同样适用于对于object中使用synchronized(this)同步代码块的场景;synchronized锁定的都是当前对象!原创 2023-05-23 11:47:41 · 269 阅读 · 1 评论 -
【八股文系列】JVM
在发生 Minor GC 之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有对象的总空间,如果大于,则此次 Minor GC 是安全的如果小于,则虚拟机会查看 HandlePromotionFailure 设置值是否允许担保失败。如果 HandlePromotionFailure=true,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小,如果大于,则尝试进行一次 Minor GC,但这次 Minor GC 依然是有风险的;原创 2023-05-23 10:32:23 · 232 阅读 · 0 评论 -
如何解决大事务问题
大家在实际项目开发中,我们在业务方法加上@Transactional注解开启事务功能,这是非常普遍的做法,它被称为声明式事务。为什么少用@Transactional注解。我们知道@Transactional注解是通过spring的aop起作用的,但是如果使用不当,事务功能可能会失效。如果恰巧你经验不足,这种问题不太好排查。至于事务哪些情况下会失效,可以参考。原创 2023-05-18 11:43:38 · 178 阅读 · 0 评论 -
spring事务不生效的多种场景
Spring事务的底层,还是依赖于数据库本身的事务支持。在MySQL中,MyISAM存储引擎是不支持事务的,InnoDB引擎才支持事务。因此开发阶段设计表的时候,确认你的选择的存储引擎是支持事务的。原创 2023-05-17 17:42:01 · 102 阅读 · 0 评论 -
如何保证接口幂等性
因为在很多业务场景中,为了保证业务正确性,往往会出现重复请求或着重复消息的情况。特别是在分布式系统中,由于网络不稳定或者负载均衡等原因,可能会出现重复请求的情况。如果接口不具备幂等性,则会导致多次重复执行相同的操作,从而导致数据的错误更新或其他问题。原创 2023-05-17 15:07:20 · 115 阅读 · 0 评论 -
HashMap何时扩容以及它的扩容机制
当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值(即当前数组的长度乘以加载因子的值的时候),就要自动扩容了。默认长度16,加载0.75扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的长度,以便能装入更多的元素。当然Java里的数组是无法自动扩容的,方法是使用一个新的数组代替已有的容量小的数组,就像我们用一个小桶装水,如果想装更多的水,就得换大水桶。原创 2023-04-16 09:49:58 · 695 阅读 · 0 评论 -
分布式ID方案总结
参考文章:https://mp.weixin.qq.com/s/VM3VxXDKY2mb2wEPT-reZA。原创 2023-04-12 10:38:57 · 360 阅读 · 0 评论 -
SpringBoot实现单机限流和分布式限流
然后在pom文件中引入相关依赖。原创 2023-04-12 09:57:07 · 228 阅读 · 0 评论 -
使用Guava和AOP实现单机版限流
计数器限流、漏桶算法,令牌桶算法、滑动窗口。原创 2023-04-12 09:42:21 · 240 阅读 · 0 评论 -
Mybatis 缓存原理
第一次发出一个查询 sql,sql 查询结果写入 sqlsession 的一级缓存中,缓存使用的数据结构是一个 map。key:MapperID+offset+limit+Sql+所有的入参value:用户信息同一个 sqlsession 再次发出相同的 sql,就从缓存中取出数据。如果两次中间出现 commit 操作(修改、添加、删除),本 sqlsession 中的一级缓存区域全部清空,下次再去缓存中查询不到所以要从数据库查询,从数据库查询到再写入缓存。原创 2023-04-12 09:28:50 · 52 阅读 · 0 评论 -
Spring AOP与AspectJ
当你不用Spring AOP提供的注解时,Spring AOP和AspectJ没半毛钱的关系,前者是JDK动态代理(接口级别),用到了CGLIB(Code Generation Library),CGLIB是一个代码生成类库,可以在运行时候动态是生成某个类的子类。代理模式为要访问的目标对象提供了一种途径,当访问对象时,它引入了一个间接的层。后者是静态代理,在编译阶段就已经编译到字节码文件中。这种情况下不使用注解,使用xml配置。原创 2023-04-11 10:37:10 · 531 阅读 · 0 评论 -
Java 定时任务选型
创建 java.util.TimerTask 任务,在 run 方法中实现业务逻辑。通过 java.util.Timer 进行调度,支持按照固定频率执行。所有的 TimerTask 是在同一个线程中串行执行,相互影响。也就是说,对于同一个 Timer 里的多个 TimerTask 任务,如果一个 TimerTask 任务在执行中,其它 TimerTask 即使到达执行的时间,也只能排队等待。如果有异常产生,线程将退出,整个定时任务就失败。原创 2023-04-10 00:04:39 · 134 阅读 · 0 评论 -
Java实现浅复制和深复制
该方法会创建一个新的对象,并将原对象的非静态字段复制到新对象中。如果原对象的字段是引用类型,则只复制引用而不复制对象本身。浅复制:将原对象的所有非静态字段复制到新对象中,如果字段是引用类型,则只复制引用而不复制对象本身。这意味着新对象和原对象引用的是同一个对象,任何一个对象的改变都会影响另一个对象。深复制:将原对象的所有非静态字段复制到新对象中,如果字段是引用类型,则创建一个新的对象,并将引用指向新对象。这意味着新对象和原对象引用的是不同的对象,它们之间的改变不会相互影响。通过序列化和反序列化实现深复制。原创 2023-04-09 23:30:35 · 184 阅读 · 0 评论 -
静态内部类
静态内部类Node与HashMap的实例无关,它具有独立的作用域和生命周期,避免了与HashMap的耦合,提高了代码的可复用性和可扩展性。使用静态内部类Node可以将键值对的数据封装在一个独立的类中,避免了对外暴露过多的类和接口,提高了代码的安全性和可维护性。静态内部类Node可以继承HashMap.Entry类,同时还可以重写父类的方法,从而具有更好的多态性和灵活性。使用静态内部类Node可以让代码更加清晰和易读,它可以将复杂的逻辑封装在一个独立的类中,从而降低了代码的复杂性。原创 2023-04-09 23:06:24 · 64 阅读 · 0 评论 -
ThreadLocal 原理
并发编程是一项非常重要的技术,它让我们的程序变得更加高效。但在并发的场景中,如果有多个线程同时修改公共变量,可能会出现线程安全问题,即该变量最终结果可能出现异常。为了解决线程安全问题,JDK出现了很多技术手段,比如:使用synchronized或Lock,给访问公共资源的代码上锁,保证了代码的原子性。但在高并发的场景中,如果多个线程同时竞争一把锁,这时会存在大量的锁等待,可能会浪费很多时间,让系统的响应时间一下子变慢。因此,JDK还提供了另外一种用的新思路:ThreadLocal。原创 2023-04-09 12:11:29 · 66 阅读 · 0 评论 -
volatile关键字
1、volatile保证变量对所有线程的可见性:当volatile变量被修改,新值对所有线程会立即更新。或者理解为多线程环境下使用volatile修饰的变量的值一定是最新的。2、jdk1.5以后volatile完全避免了指令重排优化,实现了有序性。原创 2023-04-09 10:29:11 · 49 阅读 · 0 评论 -
JAVA 锁
乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java 中的乐观锁基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。原创 2023-04-09 10:14:58 · 49 阅读 · 0 评论 -
CopyOnWriteArrayList
首先我讲一下什么是Copy-On-Write,顾名思义,在计算机中就是当你想要对一块内存进行修改时,我们不在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后呢,就将指向原来内存指针指向新的内存,原来的内存就可以被回收掉嘛!这是一种用于程序设计中的优化策略,是一种延时懒惰策略。原创 2023-04-09 00:01:56 · 74 阅读 · 0 评论 -
ConcurrentHashMap
ConcurrentHashMap使用分段锁技术,将整个数据结构分段(默认为16段)进行存储,然后给每一段数据配一把锁(继承ReentrantLock),当一个线程占用锁访问其中一个段的数据的时候,其他段的数据仍然能被其他线程访问,能够实现真正的并发访问。。数据结构:取消了Segment分段锁的数据结构,取而代之的是Node数组+链表+红黑树的结构,从而实现了对每一行数据进行加锁,进一步减少并发冲突的概率。原创 2023-04-08 21:03:12 · 297 阅读 · 0 评论 -
HashMap
JDK 7 中,HashMap 由“数组+链表”组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。在 JDK 8 中,HashMap 由“数组+链表+红黑树”组成。链表过长,会严重影响 HashMap 的性能,而红黑树搜索的时间复杂度是 O(logn),而链表是糟糕的 O(n)。原创 2023-04-08 20:18:32 · 95 阅读 · 0 评论 -
Redis的rehash原理
由于新哈希表和旧哈希表使用不同的哈希函数,因此在迁移元素时,可能会出现多个元素映射到同一个哈希槽位的情况,这种情况称为哈希冲突。Redis的rehash是指在Redis哈希表的扩容和收缩操作中,为了保证数据的正确性和一致性,需要将哈希表中的所有元素重新映射到新的哈希表中,这个过程就称为rehash。当Redis的哈希表需要进行扩容和收缩操作时,会先创建一个新的哈希表,并将其大小设置为当前哈希表大小的两倍或者一半,以便能够容纳所有元素。新哈希表的大小必须是2的倍数,这是为了保证哈希算法的正确性。原创 2023-04-08 19:55:46 · 437 阅读 · 0 评论 -
Arthas - Java 线上问题定位处理利器
Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,提供 Tab 自动补全,可以方便的定位和诊断线上程序运行问题。已经收获 Star 30000+。Arthas 官方文档十分详细,本文也参考了官方文档内容,同时在开源在的 Github 的项目里的 Issues 里不仅有问题反馈,更有大量的使用案例,也可以进行学习参考。原创 2023-04-06 11:38:34 · 162 阅读 · 0 评论 -
Redis中的RDB和AOF
RDB 和 AOF 是 Redis 中两种不同的数据持久化方式,它们各自有不同的优缺点和适用场景。原创 2023-04-06 11:37:18 · 476 阅读 · 0 评论 -
mybatis-plus 如何调试查询具体 SQL
【代码】mybatis-plus 如何调试查询具体 SQL。原创 2023-03-25 22:10:43 · 706 阅读 · 0 评论 -
StringBuffer 和 Stringbuilder 的区别
string 当修改字符串时,是在内存中创建一个新的字符串,并把地址传给string 对象,如果频繁修改会导致空间浪费。stringbuffer 和 stringbuilder 是在初始时创建一个容器,当修改的时候会修改容器中的内容,而不是创建一个新的容器,所以如果有一个需要频繁改变的字符串的话,使用 stringbuffer 或 stringbuffer。原创 2023-03-25 22:07:15 · 36 阅读 · 0 评论