54 归档分页
370 留言互动
4 核心专题

最近更新

Java 2023-03-01

多线程(二)

子线程先执行可在启动后立即调用join,使主线程阻塞直至子线程结束。线程阻塞情况包括sleep、阻塞IO、获取同步监视器、等待notify及suspend。synchronized 为JVM关键字,底层通过monitorenter/monitorexit 与对象头Mark Word 实现,支持代码块、方法及静态方法(类锁),但不能修饰静态代码块。Lock 为接口,需显式释放,可设超时、检测成功、支持公平/非公平、读写锁。ReentrantLock 基于AQS 的独占模式实现,内部有公平与非公平子类。除synchronized/Lock外,可用volatile、原子类、ThreadLocal、不可变对象保证安全。悲观锁使用synchronized/Lock,乐观锁依赖CAS。公平锁按等待队列顺序获取,非公平锁抢占更快。JDK 1.6 以后同步锁经历无锁→偏向锁→轻量级锁→重量级锁的升级,均通过Mark Word 与CAS 控制。

面经 阅读全文
Java 2023-03-01

多线程(三)

JUC(java.util.concurrent)提供原子类、锁/条件、线程池、阻塞队列、并发容器和同步器等工具。AQS 是构建锁和同步器的骨架,维护 state、等待队列并通过 FIFO CLH 队列实现阻塞/唤醒。LongAdder 通过分段计数单元降低 CAS 竞争,提高高并发计数效率。ThreadLocal 为每个线程提供独立的变量存储,内部使用 ThreadLocalMap 并采用线性探测解决哈希冲突。线程池复用线程降低创建成本,支持多种工厂方法、五种状态及四种拒绝策略,线程数应根据 CPU/IO 密集度合理设置。

面经 阅读全文
Java 2023-03-01

JVM(一)

JVM由类加载器、运行时数据区、执行引擎和本地接口四部分构成。运行时数据区包括程序计数器、虚拟机栈(及本地方法栈)、堆、方法区和运行时常量池。JVM启动先装载JRE、装入JVM动态库、初始化并创建JNIEnv,随后加载并解释class或jar文件,执行引擎将字节码翻译为机器指令。程序计数器负责指令流控制,栈用于方法调用和本地方法。内存划分决定对象、类元数据及常量的存放位置,内存不足时抛出相应异常。类加载经历加载、验证、准备、解析、初始化等阶段。

面经 阅读全文
Java 2023-03-01

JVM(二)

本文介绍JVM垃圾回收的触发时机及降低Full GC次数的措施,阐述对象可回收性的判定方式(GC Roots + 可达性),以及对象在新生代通过年龄计数晋升老年代的机制。解释新生代Eden 与两块Survivor的划分比例和双Survivor 防止碎片的作用。系统比较标记‑清除、标记‑复制、标记‑整理三大算法,重点说明G1 基于Region的局部回收策略和CMS 的并发标记‑清除流程。最后区分内存泄漏与内存溢出并给出相应的防治建议。

面经 阅读全文
Java 2023-03-01

SQL

本文系统介绍了MySQL常用SQL技术要点:分页通过LIMIT实现并给出大偏移优化方案;聚合函数COUNT、AVG、SUM、MAX、MIN的作用及与GROUP BY配合使用;表关联包括内连接、左/右外连接及多对多、自关联的实现方式;外连接的概念及MySQL不支持FULL;行转列可用CASE/IF配合聚合实现;阐述SQL注入原理及防御措施(参数校验、预编译);演示关联更新语法;对比WHERE和HAVING的作用时机与性能差异。

面经 阅读全文
Java 2023-03-01

索引

MySQL 索引是存放在磁盘上的独立结构,通过指针快速定位符合条件的行,主要有 BTREE 与 HASH 两种实现,MyISAM 只支持 BTREE,MEMORY 可用两者。索引分为普通、唯一、主键、单列、组合、全文、空间等类型,创建方式包括在 CREATE TABLE、ALTER TABLE 或 CREATE INDEX 语句。是否建索引应依据唯一性、查询、排序、分组等需求,并遵循最左前缀原则;并非所有列都适合建索引,频繁更新、低基数或不在 WHERE 中使用的列不宜建。索引能加速查询、保证唯一性、优化连接与排序,但会占用磁盘、增加维护成本。InnoDB 使用聚簇索引(主键即数据)和辅助索引(存主键指针),MyISAM 仅保存记录地址。B+树因高度低、支持范围查询而为主流,Hash 仅适合等值查询且易失效。索引失效常因函数、类型转换、LIKE 前缀或不满足最左前缀导致,可通过 EXPLAIN 检查并在必要时重建。

面经 阅读全文