- 博客(106)
- 资源 (1)
- 收藏
- 关注
原创 Redis相关
问题点原因后果缓存太短频繁失效请求频繁打到数据库,性能下降缓存太长① 占用内存保存冷数据② 删除缓存失败后脏数据持续时间长内存浪费、命中率低、可能长时间读到旧数据。
2025-10-18 17:57:42
296
原创 String相关
/ true编译器会把"abc"放进常量池,只保留一份。创建方式存放位置是否共用是否编译期确定举例备注"abc"常量池✅✅直接常量编译期常量常量池✅✅直接引用池中对象堆 + 常量池❌✅先保证常量池中有"abc",再堆中新建"ab" + "c"常量池✅✅编译期优化x + "c"堆❌❌运行期拼接创建新对象常量池✅✅intern()返回池中引用概念是否对象存放位置内容生命周期"abc"字面量✅ 是String对象堆随 JVM 存活常量池条目。
2025-10-17 16:21:12
844
原创 java中注解相关
类型特点生成时机示例匿名内部类编译期生成.class文件编译时动态代理类运行时由Proxy动态生成运行时注解对象、AOP代理对象注解本质是一个继承了Annotation的接口,它的实例对象是JVM 运行时通过动态代理生成的类,而不是匿名内部类。注解的动态代理并不是代理某个具体对象,而是代理注解在字节码中存储的键值对(元数据)。每次调用注解的方法时,代理会从内部的Map(属性 → 值)中查找并返回对应结果。
2025-10-17 15:52:37
878
原创 MySQL可重复读的级别下,幻读本质问题
类型是否使用 ReadView是否加锁是否可能幻读场景快照读(普通SELECT)✅ 是❌ 否❌ 不会读操作当前读(SELECT … FOR UPDATE / UPDATE / DELETE)❌ 否✅ 是✅ 可能(若锁不全)写操作所以——“幻读”一定是由于其他事务插入/删除引起的;而且只会发生在当前读中,因为它不受 Read View 限制。
2025-10-12 20:43:32
870
原创 G1 垃圾收集器
优先回收垃圾最多的 Region。适合大内存场景,支持停顿时间可预测。内存碎片少,老年代分步回收,不容易产生长时间 STW。叫“标记-整理”是从算法分类和效果出发:先标记存活对象,再通过跨 Region 搬迁完成内存整理。实现细节上,它采用的是复制(Copying)技术来完成整理。所以可以理解为:👉G1 老年代的标记-整理 = 标记 + 基于复制的整理。
2025-09-24 14:48:18
693
原创 常量池相关知识
永远会建堆对象,不走复用。字符串常量池的作用就是让字面量"abc""xyz"全局唯一共享,避免内存浪费,并支持intern()机制提高运行时性能。final 基本类型常量:编译期常量,进常量池(逻辑上属于方法区 / Metaspace)。static 变量:引用存在方法区(类元数据),对象在堆区。final 引用类型:引用位置同普通变量,对象在堆区。编译期常量池.class文件内部,静态字节码结构。运行时常量池:类加载后,在方法区(JDK7 前)/ 元空间(JDK8 后)。字符串常量池。
2025-09-23 12:53:09
626
原创 DCL(Double-Check Locking)只是用来创建单例吗?
好问题 👍DCL(Double-Check Locking,双重检查锁定) 并不是只能用在单例模式里,它是一种通用的并发优化思想,只是最常见的应用场景就是单例模式。DCL 的核心目标是:DCL 的套路就是:2. 除了单例,还能用在哪?✅ 常见应用场景延迟初始化某个资源延迟初始化静态变量惰性加载的缓存因为单例模式的典型需求刚好是:所以大家最常看到 DCL = 单例模式,但实际上它是一种 通用的并发优化写法。✅ 总结:
2025-09-18 16:26:13
356
原创 计算机网络相关
旧 JWT不会自己失效,必须靠额外机制。短期 Access Token + 长期 Refresh Token(最常用)。黑名单(适合高安全要求系统)。版本号机制(高效且常见)。
2025-09-07 20:50:27
498
原创 tcp粘包产生的根源
时,TCP 并不会保证“一次 send = 一次对方 recv”。的协议,它只保证字节的顺序和可靠传输,并不关心应用层的消息边界。,TCP 本身不会帮你区分“消息的边界”。的数据拼在一起,或者把一次大的。
2025-09-07 17:36:11
220
原创 IO多路复用相关知识
它们没有内核中“长期保存的集合”。每次调用 或 ,你都要把 整个数组/集合(所有要监控的 fd)重新传给内核。不管你只是新增了 1 个连接,还是 100 个连接,调用时都要把全部 fd 拷贝一次。内核里有一个持久化的数据结构(红黑树 + 就绪链表)来保存“我关心的 fd”。新连接到来时,只需 调用一次 把这个单个 fd 注册进去,内核集合就更新了。后续的 不需要再传全集合,只返回就绪 fd。是的,差异就在于:这个“苏醒”其实是个形象的说法,指的是:线程在调用 时会进入阻塞睡眠状态,当监控的 soc
2025-09-07 13:09:39
1160
原创 什么是携程?
在学习携程的概念时,我的理解是不是对的,如下:携程就类似于用户管理的线程?普通的线程是需要对应操作系统的资源的,比如线程切换等,是由操作系统进行切换上下文等信息。而携程这些都由用户程序完成,这样就不需要底层上下文进行切换了。那么,携程是在进程的基础之上还是线程上?必然要作用在可执行的线程上吧,不然如何使用资源,以及运行切换携程上下文的程序也要是一个线程或者进程吧?
2025-09-05 16:11:03
320
原创 分布式中防止重复消费
好问题!这个唯一 ID,但通常是,然后随着消息一起放进消息队列传到消费者。如果在消费端才生成唯一 ID,就失去了去重的意义,因为同一条消息多次被投递时,消费端生成的 ID 也会不同,无法判断它们是重复的。消费者拿到msg_id做去重。msg_id。
2025-09-02 18:14:13
1240
原创 git相关
冲突=两边改了同一处代码(不只是新增行),Git 无法自动判断。解决冲突时,你需要手动决定最终保留main的改动、feature的改动,或两者结合。
2025-09-02 17:54:20
924
原创 分布式一致性算法相关
Raft 是一种共识算法,用多数投票 + 日志复制来保证所有节点日志和状态机的一致性。状态机是指“执行日志操作的确定性程序”,用它保证每个节点最终状态一致。安全性保证:使用Term(任期号)确保最新的 Leader 一定包含最新的日志。即使出现网络分区,只要超过半数节点还连通,系统就能继续工作。Raft 把时间分成一个个逻辑“任期(Term)”,可以理解为“第几届 Leader 的任期”。每次开始 Leader 选举时,节点会把自己的 term 增加 1。
2025-09-01 18:49:58
850
原创 分布式事务相关02
TCC:Try 是业务显式冻结,Confirm/Cancel 由开发实现;AT:通过拦截 SQL 生成 undo log,业务透明,本地事务直接提交,回滚时用 undo 恢复。需要参与者不擅自回滚、协调者/参与者可最终恢复;否则会有阻塞或一致性风险。现实中通过协调者高可用、参与者策略、或改用其他协议来缓解。工程取舍就是在“一致性(安全)”与“可用/性能(活性)”之间权衡:银行核心常选择强一致(2PC/consensus-backed DB),高并发外围业务常用 TCC/Saga/MQ 方案。
2025-09-01 18:19:46
1086
原创 分布式事务相关
特性2PC3PC阶段数2阶段(准备+提交)3阶段(询问+准备+提交)是否阻塞容易阻塞降低阻塞概率超时机制无有数据一致性较强较弱(极端情况下不一致)复杂度较低较高适用场景强一致性系统高并发、弱一致性容忍系统3PC是在2PC的基础上引入一个询问阶段和超时机制,让参与者更智能地“自救”,减少阻塞和单点故障风险,但无法完全保证强一致性。对比点实现层数据库层事务协议业务应用层逻辑谁来执行数据库事务协调器控制提交或回滚。
2025-08-31 22:42:34
974
原创 java垃圾回收相关
核心思想基于对象的生命周期特征进行内存管理。大多数对象“朝生夕死”,存活期短。少部分对象存活时间长,会长期存在。做法年轻代(Young Generation):新对象分配的区域,回收频率高,空间较小。老年代(Old Generation):长期存活对象存放的区域,回收频率低。有的JVM还有永久代/元空间(PermGen/Metaspace),存类元数据。所以“分代”本质是一个内存管理策略,并不是算法。分代回收不是单一算法,而是一种内存管理策略。
2025-08-27 16:18:10
382
原创 类的常量和静态变量相关知识
非常好的问题!这里“类的常量”要分两种情况来看,容易混淆。我们要区分:1. 编译期常量(Compile-time Constant)2. 运行期常量(Runtime Constant)⸻🔹1. 编译期常量(static final + 基本类型/字符串字面量)• 典型例子:class Demo {static final int A = 10;static final String S = “Hello”;}⸻🔹2. 运行期常量(static final 但值在运行时才能确定)• 典型例
2025-08-24 16:24:15
822
原创 Redisson相关知识
数据结构存的内容作用Hash (普通锁就有)threadId -> 重入次数记录当前持有锁的线程List线程标识列表保证排队顺序(FIFO)ZSet控制线程最早能获取锁的时间👉list保证顺序zset保证时机。“排在队首还要等时间戳” → 确保前一个线程释放锁之后,下一个线程按顺序、按时机才能拿到锁,避免插队。公平锁没有自动续期→ 因为续期会破坏公平性。如果任务耗时不确定,不推荐用公平锁,可以用普通RLock(有看门狗自动续期)。B 丢失唤醒信号后,确实可能错过抢锁机会。
2025-08-21 21:44:22
826
原创 java中ReentrantLock使用公平锁相关问题
的线程不会立即进入 CLH 队列,而是进入。只有在signal()或时,才会被转移到 CLH 队列,等待重新竞争锁。CLH 队列 = 锁竞争阻塞队列Condition 队列 = 等待条件的线程队列最终线程一定会回到 CLH 队列,因为想继续执行必须重新抢锁。
2025-08-21 21:34:41
430
原创 redis在Spring中应用相关
KEYS对应 Java 里传的第二个参数(List 类型)ARGV对应 Java 里后面跟着的可变参数(Object… args):只是把一个锁名包装成单元素 List,以便传到 Lua 脚本的KEYS[1]。
2025-08-21 17:52:04
435
原创 类加载过程中的初始化和对象创建过程初始化区别
JVM类加载初始化:执行<clinit>(),给类的静态变量赋值,执行静态块 → 属于类级别。JVM对象实例化:new 的时候执行<init>()→ 属于对象级别。SpringBean 初始化:在实例化和依赖注入完成之后,Spring 调用的钩子方法 → 属于容器级别。👉 也就是说:你看到的“初始化是执行构造方法”,其实指的是类构造方法<clinit>(),不是我们写的对象构造函数<init>()。
2025-08-21 16:41:21
322
原创 Spring相关知识
实例化 → 属性注入 → Aware回调 → 前置处理 → 初始化 → 后置处理 → 就绪使用 → 销毁在实例化之前准备 BeanDefinition(配置扫描、合并)。加载 class 对象。调用 InstantiationAwareBeanPostProcessor → 机会点:是否要直接返回代理对象。推断用哪个构造方法。才会执行实例化 (new)。
2025-08-21 12:50:09
1419
原创 非公平锁吞吐量大的本质
公平锁:排队必然阻塞,线程上下文切换更频繁,吞吐量低。非公平锁:允许插队,能抢到就直接执行,减少阻塞开销 → 吞吐量更高。抢不到锁的线程,依旧会被阻塞休眠,并不能完全避免内核态切换。
2025-08-20 18:00:38
440
原创 TheadLocal相关
情况是否需要 remove()说明普通短生命周期线程不必线程结束后 ThreadLocalMap 随线程回收线程池线程 / 长期线程必须避免 value 长期被强引用,导致内存泄漏key 弱引用 + value 强引用→ 仅仅 ThreadLocal 对象被回收不会自动回收 value。remove()是手动清理 value,尤其在线程池场景非常重要。如果你愿意,我可以画一张ThreadLocal 内存泄漏示意图,显示线程池线程 + ThreadLocalMap + key/value。
2025-08-20 17:26:16
1371
原创 java线程池相关知识
看到 Mark Word 偏向别人时就自旋并改写线程 ID”这一描述不对。撤销偏向(可选重偏向)→ 若存在竞争则转入轻量级锁 → 这时才会自旋。
2025-08-20 16:01:17
854
原创 为什么不推荐直接用 Executors 创建线程池?
在线程池里,workQueue用来存放等待执行的任务。和默认用的是 LinkedBlockingQueue的无参构造方法它的容量是(约 2.1 billion),几乎等于无限长队列。
2025-08-20 12:34:55
346
原创 java线程状态中,WAITING和BLOCKED区别是什么?
会把 Wait Set 的线程全部转移到 Entry List。Entry List + 新来的线程 → 一起竞争锁。Java 规范没要求谁优先,JVM 通常是非公平调度,所以最终谁拿到锁是不确定的。
2025-08-19 17:23:42
690
原创 mysql||事务相关知识
m_ids:Read View 生成时刻,系统里真正活跃事务的 ID 列表。m_ids中最小的事务 ID。**max_trx_id **:全局下一个即将分配的事务 ID(比当前最大事务 ID +1)。这个区间是可能活跃的事务 ID 的范围,但不是所有都活跃,真正活跃的事务只在 m_ids 里。
2025-08-17 16:27:53
522
原创 加密货币||交易所知识
你问到的这个场景,其实就是合约市场极端单边行情下的盈亏对手方问题**。我给你拆开讲,你就能明白交易所在这种情况下是怎么扛的。举例:那会发生什么?保险基金出手ADL(自动减仓)机制启动重点:交易所并不是无限制掏自己的钱去付给多方,大部分时候是靠空方的亏损 + 保险基金 + ADL 来完成结算。大多数中心化交易所不愿意自己直接当对手盘,因为那是纯粹赌方向,很容易出巨额亏损。但现实中,为了流动性,交易所常常会用自营做市账户补足流动性,这就等于间接承担风险——所以他们会极力避免出现你说的这种“所有人一边倒”的情况。
2025-08-15 17:14:40
1052
原创 加密货币||如何监控到区块打包速度?什么是主链?
你问的问题回答谁来监控区块打包速度?每个节点自己监控(看区块时间戳)系统如何调整难度?每 2016 个区块所有节点根据规则统一自动调整有没有中心化监控机构?没有,全靠去中心算法规则驱动下面逐条来回答你的问题,帮助你厘清“主链”、“节点同步”与“区块竞争”之间的关系。主链(Main Chain):指在全网共识下,被绝大多数节点认同、并且“最长”或“累积难度最大”的那一条区块链分支。
2025-08-07 23:29:26
750
原创 加密货币||挖矿相关知识
挖矿”是区块链系统中用来打包交易、验证新区块并维护网络安全的机制。通过计算竞争,争取打包新区块的权利,并获得系统奖励(新币+交易手续费)这个过程最典型的代表就是比特币,采用了工作量证明机制(Proof of Work, PoW),也是我们常说的“挖矿”。比特币挖矿之所以设计得这么“贵”(耗电、耗算力),是为了让篡改历史或攻击网络的代价高到不值得尝试,从而通过“经济激励 + 计算难度”来保护网络的安全性。概念意思篡改某个旧区块改了旧的交易记录(比如删交易)挖出之后的区块。
2025-08-07 23:11:22
750
原创 加密货币||加密货币数量相关知识
虽然比特币的理论总量是 2100 万枚,但由于私钥丢失、误操作等原因,实际流通量在不断减少,使得比特币长期具备更强的稀缺性和通缩性特征。这既是系统设计的一部分优势,也是用户需承担的责任与风险。也正因如此,比特币保管私钥的方法、钱包的安全性,成了最重要的用户教育内容之一。是的,从技术角度看,加密货币的总量是可以改变的,但从实际运行和社区信任的角度看,几乎不可能。特别是像比特币这样的主流币,其核心价值就在于稀缺性和不可随意更改的规则。
2025-08-07 22:44:54
978
原创 java中classpath 是如何工作的...
场景Spring 查找逻辑自己写的资源文件放在,编译后进入,从 classpath 查找第三方 JAR 提供的资源放在 JAR 内部(如),Spring 也会从 classpath 的每个 JAR 中查找所有路径查找起点从每个 classpath 根目录开始找,不看包名、不看你写在哪个 Java 类下。
2025-08-07 21:43:35
386
原创 加密货币||资金交易相关知识,为何能收到黑钱?
冻结并非瞬时:从可疑交易到拿到法院冻结令,中间有监测、审核、司法授权等流程。犯罪分子利用滞后期:快速分散资金到多个账户,突破冻结封锁。追踪下家才能全面打击:识别受害者、追赃和甄别帮凶,都需要沿资金链一路往下。冻结只是手段,追踪才是核心,只有对整个资金流向了然于胸,才能更有效地阻断洗钱链条、追回涉案资金。
2025-08-06 17:17:03
763
原创 加密货币||那公钥被hash了,地址用来干嘛呢?那进行交易了,公钥也就被暴露了是吗?
收钱时地址是哈希(隐藏公钥)花钱时必须公开公钥(才能验证你是主人)问题答案地址被 hash 后干什么用?用于接收币,是资产“挂靠”的标签交易时公钥会暴露吗?✅ 是的,花钱时必须公开公钥来验证为什么不直接用公钥?安全性更高、地址更短、更防未来攻击公钥暴露安全吗?对现在的计算能力是安全的,未来量子计算可能带来挑战。
2025-08-05 22:44:47
675
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅