摘要: ②、序列号/确认机制: TCP 将数据分成多个小段,每段数据都有唯一的序列号,以确保数据包的顺序传输和完整性。同时,发送方如果没有收到接收方的确认应答,会重传数据。 ④、超时重传: 如果发送方发送的数据包超过了最大生存时间,接收方还没有收到,发送方会重传数据包以保证丢失数据重新传输。 阅读全文
posted @ 2025-04-23 14:50 kuki' 阅读(79) 评论(0) 推荐(0)
摘要: TCP 三次握手吗? TCP 首先通过三次握手和四次挥手来保证连接的可靠性 阅读全文
posted @ 2025-04-23 14:46 kuki' 阅读(13) 评论(0) 推荐(0)
摘要: TCP 是面向连接的,而 UDP 是无连接的。 阅读全文
posted @ 2025-04-23 14:41 kuki' 阅读(10) 评论(0) 推荐(0)
摘要: https://javabetter.cn/sidebar/sanfene/network.html#_25-tcp-握手为什么是三次-为什么不能是两次-不能是四次 为什么 TCP 握手不能是两次? 为了防止服务器一直等,等到黄花菜都凉了。 为了防止客户端已经失效的连接请求突然又传送到了服务器。 阅读全文
posted @ 2025-04-23 14:38 kuki' 阅读(15) 评论(0) 推荐(0)
摘要: ①、第一次握手:SYN(最开始都是 CLOSE,之后服务器进入 LISTEN) 发起连接:客户端发送一个 TCP 报文段到服务器。这个报文段的头部中,SYN 位被设置为 1,表明这是一个连接请求。同时,客户端会随机选择一个序列号(Sequence Number),假设为 x,发送给服务器。 目的:客 阅读全文
posted @ 2025-04-23 14:27 kuki' 阅读(30) 评论(0) 推荐(0)
摘要: 问题 那不同的业务,就是我们大家用不同的业务,可能会共用同一个RabbitMQ组件,不同的业务之间是怎么区分的?他这个消息是谁去消费的?就我发的消息,谁去消费,谁不消费? 回答Demo 在 RabbitMQ 中,不同业务之间的区分主要依赖于 Exchange(交换机)、Queue(队列) 和 Rou 阅读全文
posted @ 2025-04-23 13:41 kuki' 阅读(53) 评论(0) 推荐(0)
摘要: 消息队列是什么 你可以把消息队列理解为一个使用队列来通信的组件。它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下: 作用 ①、解耦 生产者将消息放入队列,消费者从队列中取出消息,这样一来,生产者和消费者之间就不需要直接通信,生产者只管生产消息,消费者只管消费消息, 阅读全文
posted @ 2025-04-23 13:21 kuki' 阅读(38) 评论(0) 推荐(0)
摘要: 了解。Java 堆被划分为新生代和老年代两个区域。 新生代又被划分为 Eden 空间和两个 Survivor 空间(From 和 To)。 新创建的对象会被分配到 Eden 空间。当 Eden 区填满时,会触发一次 Minor GC,清除不再使用的对象。存活下来的对象会从 Eden 区移动到 Sur 阅读全文
posted @ 2025-04-23 13:06 kuki' 阅读(19) 评论(0) 推荐(0)
摘要: Java 通过可达性分析算法来判断一个对象是否还存活。 通过一组名为 “GC Roots” 的根对象,进行递归扫描,无法从根对象到达的对象就是“垃圾”,可以被回收。 这也是 G1、CMS 等主流垃圾收集器使用的主要算法。 什么是引用计数法? 每个对象有一个引用计数器,记录引用它的次数。当计数器为零时 阅读全文
posted @ 2025-04-23 12:55 kuki' 阅读(17) 评论(0) 推荐(0)
摘要: 垃圾回收是什么 垃圾回收就是对内存堆中已经死亡的或者长时间没有使用的对象进行清除或回收。 JVM 在做 GC 之前,会先搞清楚什么是垃圾,什么不是垃圾,通常会通过可达性分析算法来判断对象是否存活。 Java 的垃圾回收过程主要分为 标记存活对象、 清除无用对象、 以及内存压缩/整理三个阶段。 不同的 阅读全文
posted @ 2025-04-23 12:50 kuki' 阅读(11) 评论(0) 推荐(0)
摘要: 导致原因 ThreadLocalMap 的 Key 是 弱引用,但 Value 是强引用。 如果一个线程一直在运行,并且 value 一直指向某个强引用对象,那么这个对象就不会被回收,从而导致内存泄漏。 怎么解决 很简单,使用完 ThreadLocal 后,及时调用 remove() 方法释放内存空 阅读全文
posted @ 2025-04-23 12:41 kuki' 阅读(9) 评论(0) 推荐(0)
摘要: 强引用 我先说一下强引用,比如 User user = new User("沉默王二") 中,user 就是一个强引用,new User("沉默王二") 就是强引用对象。 当 user 被置为 null 时(user = null),new User("沉默王二") 对象就会被垃圾回收;否则即便是内 阅读全文
posted @ 2025-04-23 12:22 kuki' 阅读(18) 评论(0) 推荐(0)
摘要: 1 问题 对ThreadLocal怎么理解的,它有哪些特性?又有哪些需要注意的地方。 为什么会有内存泄漏 2 ThreadLocal 是什么? ThreadLocal 是一种用于实现线程局部变量的工具类。 它允许每个线程都拥有自己的独立副本,从而实现线程隔离。 使用 ThreadLocal 通常分为 阅读全文
posted @ 2025-04-23 11:13 kuki' 阅读(16) 评论(0) 推荐(0)
摘要: 动态代理是什么? Java的动态代理是一种 在运行时动态创建代理对象的机制, 主要用于在不修改原始类的情况下 对方法调用进行拦截和增强。 Java动态代理主要分为两种类型: 基于接口的代理(JDK动态代理): 这种类型的代理要求目标对象必须实现至少一个接口。 Java动态代理会创建一个实现了相同接口 阅读全文
posted @ 2025-04-22 21:31 kuki' 阅读(22) 评论(0) 推荐(0)
摘要: @Transactional 的作用范围方法: https://javaguide.cn/system-design/framework/spring/spring-transaction.html#transactional-注解使用详解 方法:推荐将注解使用于方法上,不过需要注意的是:该注解只能 阅读全文
posted @ 2025-04-22 20:37 kuki' 阅读(50) 评论(0) 推荐(0)
摘要: 分析 左移1,导致扩容2倍 源码解析 1. 初始变量设置与容量计算 Node<K,V>[] oldTab = table; int oldCap = (oldTab == null) ? 0 : oldTab.length; int oldThr = threshold; int newCap, n 阅读全文
posted @ 2025-04-22 14:39 kuki' 阅读(51) 评论(0) 推荐(0)
摘要: 结构 JDK 8 中 HashMap 的数据结构是数组+链表+红黑树。 红黑树节点个数<6,转回链表 链表过长时,查询效率会比较低,于是当链表的长度超过 8 时(且数组的长度大于 64),链表就会转换为红黑树。 扩容2倍,负载因子 如果键值对的数量(size)/ 数组的长度,大于负载因子(默认0.7 阅读全文
posted @ 2025-04-22 11:02 kuki' 阅读(30) 评论(0) 推荐(0)
摘要: 1 问题 像性能池对吧?一般一个性能池的一个正常工作原理是什么样的? 它里面有哪些核心的参数呢?这些参数是怎么配合做工作的呢? 2 第一种回答 任务提交 → 核心线程执行 → 任务队列缓存 → 非核心线程执行 → 拒绝策略处理。 第一步,线程池通过 submit() 提交任务。 ExecutorSe 阅读全文
posted @ 2025-04-21 20:13 kuki' 阅读(5) 评论(0) 推荐(0)
摘要: https://www.w3ccoo.com/javalang/java_lang_thread.html void join() 等待此线程终止。 当调用 t1.join() 和 t2.join() 时,主线程会阻塞,直到 t1 和 t2 分别执行完毕。 static void yield() 该 阅读全文
posted @ 2025-04-21 17:57 kuki' 阅读(15) 评论(0) 推荐(0)
摘要: 线程创建方式,都是实现接口 但是Runnable,要实现run()方法,并将实现类传递给Thread的构造方法 而Callable是实现call()方法,然后创建FutureTask对象(参数为Callable的实现类),然后用FutureTask对象作参数创建Thread对象。 优点是获取线程的执 阅读全文
posted @ 2025-04-21 17:41 kuki' 阅读(10) 评论(0) 推荐(0)
摘要: 问题 多线程的场景,线程这块你平常用的多么,那像线程,比如说如果是去实现一个线程,对吧,有哪些方法? 回答 https://javabetter.cn/sidebar/sanfene/javathread.html#🌟2-说说进程和线程的区别 有三种,分别是继承 Thread 类、实现 Runna 阅读全文
posted @ 2025-04-21 17:33 kuki' 阅读(16) 评论(0) 推荐(0)
摘要: Zset 类型的底层数据结构是由压缩列表(已放弃)或跳表实现的: 跳表是有序集合 Zset 的底层实现之⼀。 在 Redis 7.0 之前, 如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 的底层实现, 否则会使用跳表; 在 Re 阅读全文
posted @ 2025-04-20 20:57 kuki' 阅读(64) 评论(0) 推荐(0)
摘要: Redis 有五种基本数据类型,这五种数据类型分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)、sorted set(有序集合,也叫 zset)。 string 字符串是最基础的数据类型,key 是一个字符串,不用多说,value 可以是: 字符串(简单的字符串、复 阅读全文
posted @ 2025-04-20 15:25 kuki' 阅读(22) 评论(0) 推荐(0)
摘要: 字段注入是一种依赖注入(Dependency Injection)的方式, 其中依赖对象直接通过在类的字段(成员变量)上加注解(例如 @Autowired、@Resource 或 @Inject)来注入,而不需要通过构造器或 setter 方法将依赖对象传入。具体说明如下: 工作原理 注解标记字段: 阅读全文
posted @ 2025-04-20 15:21 kuki' 阅读(42) 评论(0) 推荐(0)
摘要: 问题 比如说像用Spring Boot,涉及到ioc,依赖反转,就注入的这一块。一般在写代码的时候,怎么样去做Bean注入的。 比如说我用Spring框架,我做Bean注入,你在代码里,就是本身框架有哪些可以实现一个Bean注入。 @Resource是Spring提供的么,还是Java自带的,JDK 阅读全文
posted @ 2025-04-20 15:19 kuki' 阅读(52) 评论(0) 推荐(0)
摘要: 问题 做拦截,基于http比如基于那个servelet里面做filter,还是信息上报像springboot,现在这个你想去实现可以用什么方式去实现? 因为通过拦截http请求,http的一些web框架去做的。 如果只是单纯记录一些比如业务信息,这个地方还可以什么方式做么? 这里你想要拿到服务调用参 阅读全文
posted @ 2025-04-20 12:54 kuki' 阅读(29) 评论(0) 推荐(0)
摘要: 在 MyBatis 等框架中,常见的两种占位符形式为 #{} 和 ${}。两者的差别主要在于它们处理传入参数的方式,从而直接影响了 SQL 注入风险。以下是详细说明: 1. 占位符工作机制 #{} 占位符 比如,在 MyBatis 中,使用#{}占位符来代替直接拼接 SQL 语句,MyBatis 会 阅读全文
posted @ 2025-04-19 20:18 kuki' 阅读(48) 评论(0) 推荐(0)
摘要: 字段映射逻辑是指 在后端预先定义一个“白名单”或映射表, 将前端传入的字段名称与实际数据库中的字段名称建立安全且固定的对应关系, 而不是将前端传入的原始字符串直接拼接到 SQL 语句中,从而避免 SQL 注入漏洞。 1. 问题背景 通常,数据库的字段名称应由后端来控制,保证只能操作预定义的字段。若前 阅读全文
posted @ 2025-04-19 18:42 kuki' 阅读(61) 评论(0) 推荐(0)
摘要: SQL 注入漏洞 的定义 如果ORM框架在执行SQL操作时没有正确过滤或转义用户输入, 攻击者可以利用输入的恶意数据来执行未经授权的数据库操作,从而造成数据泄露、损坏或篡改。 什么情况下会引起 SQL 注入攻击呢?通常是在以下情况: 表结构部分:通常包含表字段、表名等固定内容。 表字段参数/变量部分 阅读全文
posted @ 2025-04-19 10:36 kuki' 阅读(24) 评论(0) 推荐(0)
摘要: 摘录自 https://blog.csdn.net/u012060033/article/details/108442434 1 ibatis基础 iBatis 是一个持久层框架。 在Apache寄居六年之后,iBatis将代码托管到Google Code。于此同时,iBatis 更名为 MyBat 阅读全文
posted @ 2025-04-18 23:50 kuki' 阅读(230) 评论(0) 推荐(0)
摘要: iBatis和MyBatis两者之间有什么差异? SQL写在XML文件,一般如何做安全性上的一些防范。 写了一个SQL,变量不是用变量做替换,怎么防止外面的黑客做攻击,比如写SQL的时候,做替换,有没有留意一些SQL可能要防范攻击的,针对这个SQL的安全漏洞的注入。比如像MyBatis和IBatis 阅读全文
posted @ 2025-04-18 20:52 kuki' 阅读(5) 评论(0) 推荐(0)
摘要: 1 单体synchronized的缺陷 synchronized是JVM内部锁 两者都进入了锁的内部,这个synchronized锁形同虚设,这是由于synchronized是本地锁,只能提供线程级别的同步,每个JVM中都有一把synchronized锁,不能跨 JVM 进行上锁,当一个线程进入被 阅读全文
posted @ 2025-04-15 17:00 kuki' 阅读(60) 评论(0) 推荐(0)
摘要: ArrayList ArrayList() 此构造函数用于创建一个初始容量足以容纳 10 个元素的空列表。 boolean add(E e) 此方法将指定元素附加到此列表的末尾。 E remove(int index) 此方法删除此列表中指定位置的元素。 阅读全文
posted @ 2025-04-15 16:54 kuki' 阅读(15) 评论(0) 推荐(0)
摘要: java.lang.string https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern-- intern public String intern() 返回字符串对象的规范表示。 Returns a canoni 阅读全文
posted @ 2025-04-15 15:35 kuki' 阅读(26) 评论(0) 推荐(0)
摘要: https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html Another way to create synchronized code is with synchronized statements. U 阅读全文
posted @ 2025-04-15 15:20 kuki' 阅读(13) 评论(0) 推荐(0)
摘要: https://baomidou.com/guides/wrapper/#示例-3 gt gt 方法是 MyBatis-Plus 中用于构建查询条件的基本方法之一,它用于设置单个字段的大于条件。 使用范围 QueryWrapper LambdaQueryWrapper UpdateWrapper L 阅读全文
posted @ 2025-04-15 14:47 kuki' 阅读(32) 评论(0) 推荐(0)
摘要: https://baomidou.com/guides/data-interface/#count count // 查询总记录数 int count(); // 根据 Wrapper 条件,查询总记录数 int count(Wrapper<T> queryWrapper); //自3.4.3.2开 阅读全文
posted @ 2025-04-15 14:40 kuki' 阅读(15) 评论(0) 推荐(0)
摘要: 解决一人一单的逻辑 乐观锁 乐观锁需要判断数据是否修改,而当前是判断当前是否存在,所以无法像解决库存超卖一样使用CAS机制, 但是可以使用版本号法,但是版本号法需要新增一个字段, 悲观锁 所以这里为了方便,就直接演示使用悲观锁解决超卖问题 加悲观锁的逻辑 1. 使用Mybatis-Plus判断各种字 阅读全文
posted @ 2025-04-15 13:03 kuki' 阅读(107) 评论(0) 推荐(0)
摘要: boolean flag = seckillVoucherService.update( new LambdaUpdateWrapper<SeckillVoucher>() .eq(SeckillVoucher::getVoucherId, voucherId) .eq(SeckillVoucher 阅读全文
posted @ 2025-04-15 12:48 kuki' 阅读(51) 评论(0) 推荐(0)
摘要: 涉及的表 tb_voucher:优惠券的基本信息,优惠金额、使用规则等 tb_seckill_voucher:优惠券的库存、开始抢购时间,结束抢购时间。特价优惠券才需要填写这些信息 voucher_id 主键 关联的优惠券... stock 库存 create time 创建时间 begin tim 阅读全文
posted @ 2025-04-15 12:38 kuki' 阅读(84) 评论(0) 推荐(0)