加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

面试现场【MySQL篇】

MySQL 主从复制通过 binlog、relay log、SQL 线程实现数据同步,主库负责读写、从库提供只读,提升可用性和读写分离。文中阐述了主主、主从、主备的区别,说明了长连接、binlog 格式(statement、row、mixed)保障一致性,并分析了机器性能、查询压力、大事务、网络等导致的复制延迟及相应优化措施。最后介绍了双机主备、一主一从、一主多从、MariaDB 多主集群和 Mycat 中间件等高可用方案。

Java面试必会知识点

抱歉,我无法直接访问和读取该链接中的内容。请您将文章的正文文本粘贴在这里,我会根据提供的文字为您生成符合要求的简洁摘要。

面试现场【JVM篇】

文章提供了JVM面试常见题目及详尽答案,系统阐述了JVM内存结构(程序计数器、虚拟机栈、本地栈、堆、方法区、直接内存)、GC Roots 类型、四种引用(强、软、弱、虚)以及分代收集假设。进一步介绍了垃圾回收算法(标记清除、复制、标记整理)、STW 与安全点、OopMap 的作用,并概括了主流收集器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS)的特点和适用场景。

面试现场【综合篇】

文章围绕面试常见技术点展开,先示例如何从项目经验、设计优化和代码亮点切入;随后系统阐述零拷贝的概念、实现方式及其对上下文切换和拷贝次数的削减;归纳五种IO模型,比较NIO与多路复用(select、poll、epoll)的区别与优势;解析FutureTask阻塞获取结果的内部状态机与等待机制;对比ReentrantLock与synchronized的实现原理及适用场景;并简要涉及乐观/悲观锁、AQS、Paxos、B+树、TCP拥塞、JVM调优、分库分表、分布式事务、RocketMQ可靠性等面试热点。整体提供了技术要点的概念解释与实现细节,帮助读者在面试中快速组织答案。

Synchronized详解

synchronized 用于对共享可变资源实现互斥访问,其本质是对象锁(monitor)。JVM 将 synchronized 编译为 monitorenter/monitorexit 指令,监视器锁存于对象头的 Mark Word 中,并通过偏向锁、轻量级锁、重量级锁以及自旋锁实现层次化优化;在无竞争时偏向锁可省去 CAS,轻量级锁通过自旋避免线程阻塞,竞争激烈时升为重量级锁。JIT 还能基于逃逸分析进行锁消除,进一步提升性能。整体上,synchronized 的实现依赖对象的 Monitor、对象头布局以及一系列 JVM 优化技术,使其在现代 JDK 中的并发性能已基本与显式 Lock 持平。

看一遍就理解:零拷贝详解

零拷贝指在 I/O 过程中不进行用户态与内核态之间的数据复制,减少上下文切换和 CPU 拷贝,从而提升吞吐。传统 read/write 需四次态切换、四次拷贝,效率低下。文章回顾内核/用户空间、DMA 等基础概念,详细阐述三种实现方式:mmap + write、sendfile,以及支持 DMA scatter/gather 的 sendfile(全 DMA、真正零拷贝)。随后说明 Java NIO 通过 MappedByteBuffer(映射 mmap)和 FileChannel.transferTo/transferFrom(底层调用 sendfile)提供零拷贝,解释其在 Kafka、RocketMQ 等高性能系统中的关键作用。

聊聊幂等设计

本文围绕幂等概念展开,先解释幂等在数学和计算机中的含义及其必要性,尤其在远程调用超时、重复消费、表单重复提交等场景中的风险。阐述处理超时的两种思路:查询下游状态或依赖幂等接口。随后指出实现幂等的关键是全局唯一标识(UUID、Snowflake 等),并提供八种常见实现方案:①先查后插+唯一键冲突;②直接插入捕获冲突;③基于状态机的更新判断;④使用独立防重表;⑤Token 令牌;⑥悲观锁;⑦乐观锁(版本号);⑧分布式锁(Redis/ZooKeeper)。最后列举 HTTP 方法的幂等性,说明 GET、HEAD、OPTIONS、DELETE、PUT 为幂等,而 POST 不具幂等性。整体强调幂等设计的流程、实现技巧及其在分布式系统中的重要性。

面试现场【MQ篇】

本文梳理了面试中常见的10道消息队列(MQ)问题及要点,包括MQ的概念与主流实现(Kafka、RocketMQ、RabbitMQ),典型使用场景(解耦、削峰、异步、通讯、远程调用),防止消息丢失的措施(生产者同步/事务、存储同步刷盘与复制、消费ACK),顺序保证方式(同分区/单消费者或局部有序),重复消费与幂等处理(唯一标识、缓存),积压处理思路(排查、批量、水平扩容、临时多队列),技术选型对比(吞吐、语言、持久化、顺序、集群),高可用机制(Kafka副本选主),事务消息实现原理,以及设计自研MQ时需考虑的架构要素(producer‑broker‑consumer 流程、RPC、持久化、消费模型、可靠性、HA、事务、伸缩)。

Redis 缓存击穿、缓存穿透、缓存雪崩的解决方案

Redis 通过在 DB 前构建高速缓存,显著提升 TPS 与 QPS,但若缓存设计不当会出现三大问题。①缓存击穿:热点数据在高并发下刚失效,所有请求涌向 DB。解决方案包括不设过期或加随机失效时间、预热热点数据、使用分布式锁只让一个请求查询 DB 并写回缓存。②缓存穿透:查询不存在的键导致每次都穿透到 DB。常用办法是缓存空值或使用布隆过滤器在查询前快速判断键是否可能存在。③缓存雪崩:大量键同时失效或 Redis 故障,使流量瞬间冲击 DB。防护措施有为键设置基准+随机失效时间、接口限流、服务熔断以及部署 Redis 哨兵或 Cluster 实现高可用。通过这些手段可保证缓存层的稳定性,防止对后端数据库造成致命压力。

面试现场【List篇】

面试围绕 Java List 进行。说明 List 为接口,常用实现为 ArrayList(数组,查询快,容量不足时 1.5 倍扩容)和 LinkedList(链表,增删快)。ArrayList 适合查询多、增删少,LinkedList 适合增删多、查询少。比较 List 与 Set,前者有序可重复,后者无序不可重复且基于 Map 实现。简述 Vector(线程安全、扩容 2 倍)已少用,提供线程安全 List 的方式有 Collections.synchronizedList 与 CopyOnWriteArrayList,后者采用写时复制,优点是读无锁,缺点是占内存大且读到旧数据。最后提及 List 排序可用 sort/Collections.sort,遍历删除应使用 Iterator.remove 或 list.removeIf,以避免 fast‑fail。

Redis分布式锁的七种方案

Redis 分布式锁常用于秒杀、抢红包等高并发场景。文章首先阐明可靠锁应具备互斥、超时自动释放、可重入、高性能、高可用和安全性等特征,随后系统梳理了七种实现方案:①SETNX + EXPIRE(非原子导致死锁)②SETNX + value 保存时间戳(依赖时间同步且易被覆盖)③Lua 脚本实现 SETNX+EXPIRE 原子化④SET EX PX NX(仍可能提前失效)⑤在价值中加入唯一标识并用 Lua 校验后删除(避免误删)⑥Redisson 框架的看门狗自动续期解决业务未完成即锁失效的问题⑦Redlock 多主节点算法,通过在多数节点上获取锁并在超时内完成,提升跨节点的可靠性。全文对每种方案的优缺点作了对比,并推荐在实际项目中使用 Redisson 或 Redlock 实现安全高效的分布式锁。

面试现场【多线程篇】

小邹说明多线程用于提高资源利用率和CPU并发能力,典型场景有高并发读写、耗时任务异步处理和定时任务。线程安全指多线程访问同一对象时无需额外同步仍能得到正确结果,常用手段包括原子类、CountDownLatch、Semaphore、java.util.concurrent集合、synchronized、Lock及分布式锁。synchronized 通过 monitorenter/monitorexit 实现对象头锁,方法级使用 ACC_SYNCHRONIZED 标志。ReentrantLock 需手动释放、可设公平性、支持可中断、超时及 tryLock。CAS(Compare‑And‑Swap)是乐观锁实现方式,AtomicInteger 等基于 CAS 完成无锁同步。