加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

面试现场【MySQL篇】

本文系统介绍了 MySQL 主从架构的概念、优势与应用场景,详细阐述了基于 binlog 的复制流程及主从一致性保障机制,分析了导致主从延迟的硬件、查询、大事务、网络等因素并给出相应优化方案。随后比较了主主、主从、主备三种模式的区别,重点列举了双机主备、一主一从、一主多从、MariaDB 多主集群以及基于中间件的高可用方案,各自的优缺点与适用场景,为构建高可用、读写分离的 MySQL 系统提供了完整的技术指引。

Java面试必会知识点

抱歉,我无法直接访问该链接的内容。请您把文章的正文粘贴到聊天框中,我再为您生成符合要求的摘要。

面试现场【JVM篇】

本文系统梳理了JVM面试常见题目,详细说明了JVM内存划分、GC根、四类引用及其回收算法、分代收集理论、标记‑清除/复制/整理算法、STW 与安全点、OopMap作用、常用垃圾收集器(Serial、Parallel、CMS、G1等)以及对象布局、类加载机制等关键概念,帮助读者快速掌握JVM核心原理。

面试现场【综合篇】

本文以“面试现场综合篇”为框架,列出常见高频面试题并给出要点式解答,涵盖项目亮点、零拷贝实现原理、五种IO模型及NIO 与多路复用区别、Future 阻塞获取结果的内部机制、ReentrantLock 与 synchronized 的实现与差异、AQS、乐观/悲观锁、Paxos 流程、B+树特性、TCP 拥塞控制、JVM 调优、分库分表缺点与分布式事务(TCC)方案、RocketMQ 消息可靠性保障以及简单算法示例,帮助读者快速梳理面试重点并掌握核心概念。

Synchronized详解

synchronized 用于对共享可变资源实现互斥访问,其本质是对象锁。加锁方式包括同步实例方法、静态方法和代码块,底层通过 JVM 的 monitorenter/monitorexit 指令进入/退出对象的 Monitor 实现,最初依赖 OS 的互斥锁。自 JDK 1.5 起,JVM 引入偏向锁、轻量级锁、锁粗化、锁消除、适应性自旋等优化,使同步性能接近显式 Lock。每个对象的 Mark Word(对象头)记录锁状态、哈希、GC 信息,随对象状态在无锁、偏向、轻量、重量四种锁之间单向升级。工具 JOL 可实时查看对象头。了解这些原理有助于正确使用 synchronized 并在必要时通过 JVM 参数调优或采用更高效的锁实现。

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

零拷贝是一种 I/O 优化技术,指在数据传输过程中不进行用户态与内核态之间的拷贝,从而减少上下文切换和 CPU 负担。文章先阐述传统 read/write 流程需四次态切换、四次拷贝,并回顾内核/用户空间、上下文切换、虚拟内存和 DMA 的基本概念。随后介绍三种零拷贝实现方式:mmap + write(减少一次 CPU 拷贝),sendfile(仅两次态切换、一次 CPU 拷贝),以及带 DMA scatter/gather 的 sendfile(全部由 DMA 完成,真正零拷贝)。最后说明 Java NIO 中的 MappedByteBuffer(基于 mmap)和 FileChannel.transferTo/transferFrom(基于 sendfile)提供了零拷贝能力,常用于高性能消息系统如 Kafka。

聊聊幂等设计

幂等指一次或多次请求产生相同副作用,是分布式系统防止重复操作的关键。文章先解释幂等概念和在转账、MQ、表单等场景中的必要性,随后讨论超时处理:通过查询接口或直接重试依赖下游幂等。实现幂等的核心是全局唯一标识(UUID、Snowflake 等),并给出八种常用方案:①先查后插并捕获唯一键冲突,②直接插入捕冲突,③基于状态机的更新行数判断,④使用独立防重表,⑤ token 令牌,⑥悲观锁,⑦乐观锁(version),⑧分布式锁(Redis/ZooKeeper)。最后说明 HTTP 方法的幂等性:GET、HEAD、OPTIONS、DELETE、PUT 为幂等,POST 则不具备。

面试现场【MQ篇】

文章介绍了消息队列的概念、常见应用场景(解耦、削峰、异步等),并系统回答十个面试重点:如何防止消息丢失(生产者同步发送、刷盘、主从复制),保证顺序(同分区、单消费者),处理重复消费与幂等,解决积压(优化消费、扩容),技术选型对比Kafka、RocketMQ、RabbitMQ,说明高可用实现原理(副本选举),事务消息确保一致性,最后给出设计自研 MQ 的架构要点,包括 Producer‑Broker‑Consumer 流程、持久化、分区扩展、幂等、HA 与事务等。

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

Redis 用作缓存可提升 DB 性能,但设计不当会出现缓存击穿、穿透、雪崩三大问题。击穿:热点数据失效时并发穿库,可用随机过期、预热、分布式锁防止;穿透:查询不存在的数据,可缓存空值或使用布隆过滤器拦截;雪崩:大量键同失效或 Redis 故障导致请求涌向 DB,可通过随机过期、接口限流、熔断以及搭建 Redis 高可用集群来缓解。总结三者区别与对应解决方案。

面试现场【List篇】

文章模拟面试围绕Java List展开,说明List是接口,常见实现为ArrayList(基于数组,查询快,容量不足时按1.5倍扩容)和LinkedList(基于链表,增删快,无需扩容)。比较两者适用场景:ArrayList适合频繁随机访问,LinkedList适合频繁增删。进一步阐述Set与List的区别、Vector的历史及其线程安全特性。重点介绍线程安全的List实现方式:Collections.synchronizedList和CopyOnWriteArrayList,解释后者写时复制的原理及其内存占用和读旧数据的缺点。最后给出List排序及遍历时安全删除元素的常用写法。

Redis分布式锁的七种方案

Redis分布式锁的七种实现:①SETNX+EXPIRE(非原子)②SETNX+时间戳值(需时间同步)③Lua脚本保证原子④SET扩展命令SET NX EX PX⑤唯一随机值+Lua检查释放⑥Redisson(看门狗自动续期)⑦Redlock(多节点多数投票)。文章阐述锁应具备互斥、超时、可重入、高性能、安全等特性,分析各方案优缺点,推荐使用Redisson或Redlock以获得可靠的分布式锁。

面试现场【多线程篇】

面试围绕多线程展开,阐述了使用多线程提升资源利用率和并发能力的原因及适用场景,如高并发文件处理、耗时任务和定时任务。随后解释了线程安全的概念,并提出针对原子性、线程控制、并发集合等常用的解决手段,包括原子类、CountDownLatch、Semaphore、并发集合、synchronized、Lock以及分布式锁。进一步说明了 synchronized 的底层实现(monitorenter/monitorexit 与 ACC_SYNCHRONIZED 标志)及其与 ReentrantLock 的区别——锁释放方式、是否公平、可中断性、超时和 tryLock 等特性。最后简要介绍了 CAS(比较并交换)及其在乐观锁、AtomicInteger 等实现中的作用。