Java
未读
【JVM篇】Java垃圾收集详解
序言垃圾收集(Garbage Collection,下文简称GC)。程序计数器、虚拟机栈、本地方法栈随线程而生,也随线程而灭;栈帧随着方法的开始而入栈,随着方法的结束而出栈。这几个区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回
【每日一问】请说说synchronized和ReentrantLock的区别?
1、synchronized是JVM层次的锁实现,ReentrantLock是JDK层次的锁实现;
2、synchronized的锁状态是无法在代码中直接判断的,但是ReentrantLock可以通过ReentrantLock#isLocked判断;
Java
未读
【并发编程】深入理解ConcurrentHashMap
ConcurrentHashMap在HashMap基础上实现线程安全,核心区别在于:写入操作采用同步机制(Java7用ReentrantLock分段锁,Java8优化为synchronized+CAS),读操作无锁;扩容时数据迁移并发执行,效率更高。扩容由put操作触发,通过ForwardingNode节点标识迁移状态,新线程可协助扩容。迁移时链表按hash&n拆分为高低位链表,红黑树则遍历拆分后根据长度决定是否转链表。整体采用"空间换时间"的CopyOnWrite思想,写时复制副本加锁,读时无锁访问原数组,实现读多写少场景下的高效并发。
Java
未读
【并发编程篇】HashMap底层实现原理
HashMap是Java中常用的键值对存储集合,基于哈希表实现,非线程安全,允许null键(仅一个)和null值(多个)。其底层数据结构随版本演进:JDK1.7采用数组+链表(拉链法解决哈希冲突);JDK1.8优化为数组+链表/红黑树,当链表长度≥8且数组容量≥64时,链表转为红黑树提升查询效率。默认初始容量16,扩容时容量翻倍(始终为2的幂),加载因子默认0.75(平衡空间与性能)。哈希值计算通过扰动函数减少冲突,JDK1.8简化为`(h = key.hashCode()) ^ (h >>> 16)`。核心操作如put/get通过`(n-1) & hash`定位索引,冲突时遍历链表或树。扩容(resize)涉及数据迁移,JDK1.8优化了重哈希逻辑,避免链表逆序。遍历基于迭代器,支持快速失败机制。
Java
未读
【并发编程篇】Java并发线程池底层原理详解与源码分析
1、无处不在的线程和进程1.1 进程的基本原理进程的定义一直以来没有完美的标准。一般来说,一个进程由程序段、数据段和进程控制块三部分组成。程序段一般也被称为代码段。代码段是进程的程序指令在内存中的位置,包含需要执行的指令集合;数据段是进程的操作数据在内存中的位置,包含需要操作的数据集合;程序控制块(
Java
未读
【并发编程篇】从源码层面深入理解AQS
本文介绍了AQS(AbstractQueuedSynchronizer)作为Java并发包的核心基础框架,旨在解决CAS自旋锁导致的CPU资源浪费和总线风暴问题。AQS采用队列削峰策略,通过FIFO双向队列管理线程竞争,核心组件包括:
1. **状态标志位**:`volatile int state`标识锁状态,通过CAS保证原子性;
2. **队列节点**:`Node`类封装线程与状态(如SIGNAL、CANCELLED),支持独占/共享模式;
3. **模板方法**:定义`acquire/release`等流程,子类通过钩子方法(如`tryAcquire`)实现具体锁逻辑。
线程竞争失败时入队阻塞,锁释放时唤醒后继节点,避免空自旋。AQS为ReentrantLock、Semaphore等同步器提供统一实现基础,兼顾公平性、可重入等特性。
Java
未读
【并发编程篇】并发锁机制之深入理解synchronized
1. Java共享内存模型带来的线程安全问题1.1 引入案例两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗public class SyncDemo { private static int counter = 0; public stati
Java
未读
【JVM篇】Java开疆拓土的垃圾收集器ZGC
为了满足不同的业务需求,Java 的 GC 算法也在不停迭代,对于特定的应用,选择其最适合的 GC 算法,才能更高效的帮助业务实现其业务目标。对于这些延迟敏感的应用来说,GC 停顿已经成为阻碍 Java 广泛应用的一大顽疾,需要更适合的 GC 算法以满足这些业务的
Java
未读
【JVM篇】从源码角度分析JVM类加载机制
本文系统阐述了JVM的跨平台实现原理、Java编译过程及类加载机制。JVM通过将Java源码编译为平台无关的字节码(.class文件),再由各平台JVM解释或编译为本地机器码执行,实现“一次编译,到处运行”。javac编译过程包括词法分析、语法分析、语义分析、解语法糖等八个阶段,生成符合JVM规范的字节码。类加载子系统负责加载、验证、准备、解析和初始化类,采用双亲委派机制(Bootstrap/Extension/Application类加载器)确保类唯一性和安全性,避免核心库被篡改。特殊场景如Tomcat需打破双亲委派,通过自定义类加载器实现Web应用隔离和热部署。

