并发编程
并发编程的目标是充分利用多核 CPU,同时保证共享数据的正确性。Java 在语言层和类库层都提供了丰富的并发原语。
线程基础
通过继承 Thread 或实现 Runnable(更灵活,可避免单继承限制)创建任务,调用 start() 启动新线程;直接调用 run() 只是普通方法调用。Thread.sleep、Object.wait/notify 用于协调时序。
synchronized 与 volatile
synchronized 是 Java 内置的互斥锁,锁对象可以是 this、任意对象或 Class 对象;JVM 底层通过对象头 Mark Word 与 monitor 实现。volatile 提供轻量级可见性保证:写入立即刷新到主内存,读取从主内存加载,适用于单写多读的状态标志。
ReentrantLock 与 AQS
java.util.concurrent.locks.ReentrantLock 显式支持可中断、定时、公平与非公平锁。其内部基于 AQS(AbstractQueuedSynchronizer) 实现,核心是一个 volatile 状态变量与一个 CLH 等待队列。
ConcurrentHashMap
JDK 8 中 ConcurrentHashMap 采用 CAS + synchronized(桶头节点) 实现线程安全,不再使用分段锁,大幅提升并发度。
线程池
ThreadPoolExecutor 关键参数:核心线程数 corePoolSize、最大线程数 maximumPoolSize、存活时间 keepAliveTime、任务队列 workQueue、拒绝策略 RejectedExecutionHandler。生产环境推荐使用 Executors 的工厂方法,或直接构造 ThreadPoolExecutor 并明确参数。