volatile 只提供可见性与有序性(内存屏障 + happens-before),不提供互斥;适合“读多写少、状态简单”的场景,比如停止标志、配置热更新指针、双重检查单例的指针。 它保证了什么 可见性:对 volatile 变量的写会立刻刷新到主内存;其他线程读到的是最新值。 有序性: 写 vo...
1) 什么是大 Key & 有啥危害 定义:单个 key 的值很大(String 体积大)或元素很多(Hash/List/Set/ZSet 的 field/成员量很大)。 危害: 阻塞:对大 key 做 DEL/HGETALL/LRANGE 等重操作,可能长时间占用 CPU,造成主线程阻塞、...
能否继承(extends) 不能 String 是 final 类(public final class String),final 修饰的类不能被继承。 设计原因: 确保不可变性(Immutable)不会被破坏; 保障哈希值缓存逻辑(hashCode 缓存)稳定; 防止安全漏洞(String 在类...
“Kafka 并发量高”不是玄学,是一套设计取舍叠出来的结果(同类里常见最高吞吐)。核心原因与落地要点如下: 为什么快(架构层面) 分区(Partition)横向扩展 一个 Topic 拆成多分区,生产者/消费者按分区并行,吞吐≈分区数×单分区吞吐。队列天然并行,而不是单队列串行。 顺序追加 + 磁...
1.红黑树的基本概念与数据结构表示 首先红黑树来个定义: 红黑树定义:红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树(平衡二叉树的一种实现方式)。 我们知道一颗基本的二叉排序树他们都需要满足一个基本性质:即树中的任何节点的值大于它的左子节点,...
针对每秒 1 万 QPS 持续存储的需求,尤其是涉及到像万达广场这样的大型分布式系统,设计一个高效、可靠的数据收集和存储方案至关重要。以下是基于 MQTT 和 HBase 的整体架构思路: 数据收集和传输 MQTT(消息队列遥测传输协议): 适用场景:MQTT 适用于大量设备数据的低带宽、高延迟和不...
一、Java 有哪些“锁”(按语义/实现分类) 1) 语言级 synchronized(对象监视器,JVM 指令 monitorenter/monitorexit) 特性:可重入、不可中断获取、无超时、自动释放、异常即释放、内存语义强(解锁→加锁 happens-before)。 HotSpot 锁...
什么是多态 “同一接口,不同实现;父类/接口类型引用指向子类对象,调用被子类重写后的方法,表现出不同行为。” 核心是 运行时多态(method overriding + 动态绑定)。 成立条件(4 件套): 继承/实现(class 继承或 implements interface) 方法 重写(@O...
你说的其实是 serialVersionUID(不是 java.util.UUID)。它是 Java 原生序列化里给 类定义的“版本号”,用途主要有三点: 版本匹配/校验 当对象被序列化成字节流时,会把该类的 serialVersionUID 一起写入。反序列化时,JVM 会拿 流里的 UID 和 ...
算法复杂度共分为两类:时间复杂度、空间复杂度 时间复杂度是指执行这个算法所需要的计算工作量时间; 空间复杂度是指执行这个算法所需要的内存空间。 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,也代表了时间复杂...
会的。 原因是: Arrays.asList() 返回的并不是一个新的 ArrayList,而是 java.util.Arrays 里的一个静态内部类 Arrays$ArrayList(注意它和 java.util.ArrayList 不是同一个类)。 这个类的底层直接引用你传入的数组作为数据存储,...
循环依赖要尽量通过设计消除;Spring 只对单例 + 非构造器注入的场景用“提前暴露引用(三级缓存)”做了兜底,其他大多不行或有隐患。推荐用构造器注入让问题暴露,再用重构/解耦手段解决;万不得已再用 @Lazy/ObjectProvider 等“延迟拿 Bean”的技巧。 一、Spring 能/不...
什么是 Redis 中的脑裂? 脑裂现象指在 Redis 主从集群中,同时存在两个主节点,并且这两个主节点都能接收写请求。这种情况通常发生在以下场景: 当前主库突然“失联”但并未真正故障,哨兵(Sentinel)系统检测到主库失联后,启动主从切换机制,将某个从库提升为新主库。 原主库从假故障中恢复后...
后面页面慢,根因只有一句话:LIMIT offset, size 会先扫描并丢掉 offset 行,再取 size 行。offset 越大,白干活越多,所以越慢。再细化到执行层面: 为什么会慢(机制层) 跳过不是“跳过去”,而是“扫过去” B+Tree 只能按“键值”跳转,按“第 N 行”没有直接定...