基于 JDK 1.8+ 的 synchronized 关键字深度解析。
一、基础部分
1.1 synchronized 概述
synchronized 是什么?
Java 内置的关键字,用于实现线程同步,本质是对象锁(Monitor Lock)。
提供的三大特性:
| 特性 | 说明 |
|---|---|
| 原子性 | 同步块内的操作要么全部执行,要么全部不执行 |
| 可见性 | 释放锁时,将工作内存刷回主内存;获取锁时,从主内存重新读取 |
| 有序性 | 同一时刻只有一个线程执行同步块,表现为串行 |
基于 JDK 1.8+ 的 synchronized 关键字深度解析。
synchronized 是什么?
Java 内置的关键字,用于实现线程同步,本质是对象锁(Monitor Lock)。
提供的三大特性:
| 特性 | 说明 |
|---|---|
| 原子性 | 同步块内的操作要么全部执行,要么全部不执行 |
| 可见性 | 释放锁时,将工作内存刷回主内存;获取锁时,从主内存重新读取 |
| 有序性 | 同一时刻只有一个线程执行同步块,表现为串行 |
基于 JDK 1.8 源码的 CountDownLatch 核心原理分析。
CountDownLatch 是基于 AQS 共享模式(Shared Mode)实现的同步辅助类,用于协调多个线程之间的执行顺序。核心语义:一个或多个线程阻塞等待,直到其他线程完成一系列操作后释放。
| 场景 | 描述 | 模型 |
|---|---|---|
| 多等一 | 多个工作线程等待一个信号,如压测时统一发令 | 主线程 countDown,工作线程 await |
| 一等多 | 一个线程等待多个任务完成,如主线程等待资源初始化 | 工作线程 countDown,主线程 await |
基于 JDK 1.8 源码的 CyclicBarrier 核心原理分析。
可重置特性:当所有线程到达栅栏点后,栅栏自动重置为初始状态,可供下一轮同步使用。这与 CountDownLatch 的一次性设计形成鲜明对比。
同步语义:阻拦线程直到满员。所有参与线程必须到达栅栏点后,才能统一放行。
// 5 个线程,在栅栏点汇合
CyclicBarrier barrier = new CyclicBarrier(5, () -> {
System.out.println("全员到齐,开始下一阶段");
});
for (int i = 0; i < 5; i++) {
new Thread(() -> {
doPhase1();
barrier.await(); // 等待其他线程
doPhase2();
}).start();
}
基于 JDK 1.8 源码的读写锁核心原理分析。
假设你有一个缓存,100 个线程读,1 个线程偶尔写。如果用 ReentrantLock:
// 悲剧:读也要排队!
lock.lock();
try {
return cache.get(key); // 明明只是读,也要等锁
} finally {
lock.unlock();
}
基于 JDK 1.8 源码的 Semaphore 核心原理分析。
Semaphore 是基于 AQS 共享模式(Shared Mode)实现的流量控制工具,用于限制同时访问特定资源的线程数量。
停车场容量:3 个车位(permits = 3)
车辆1 进场 → permits = 2
车辆2 进场 → permits = 1
车辆3 进场 → permits = 0
车辆4 进场 → permits < 0,排队等待
车辆1 离场 → permits = 1 → 唤醒车辆4
待定,暂时先不看这个邮戳锁,后面再来细细研究!
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程执行: " + Thread.currentThread().getName());
}
}
// 使用
MyThread t = new MyThread();
t.start();
基于 JDK 1.8 源码的 AQS 核心骨架与基础架构分析。
public abstract class AbstractOwnableSynchronizer {
private transient Thread exclusiveOwnerThread;
}
public abstract class AbstractQueuedSynchronizer
extends AbstractOwnableSynchronizer {
private volatile int state;
private transient volatile Node head;
private transient volatile Node tail;
}
JMM 是 Java 虚拟机规范中定义的一套规则,用来规范多线程访问共享变量的行为,保证程序在各种平台上都能正确地并发执行。
┌─────────────────────────────────────────────────────┐
│ 主内存 (共享) │
│ 共享变量:x = 0, flag = false │
└───────────┬────────────────────────┬────────────────┘
│ │
read/write read/write
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ 工作内存 (线程1) │ │ 工作内存 (线程2) │
│ 私有,存变量副本 │ │ 私有,存变量副本 │
└──────────────────┘ └──────────────────┘
基于 JDK 1.8 源码的 JUC 锁核心原理分析。
ReentrantLock 是独占模式(Exclusive)的可重入互斥锁,基于 AQS 实现,是 synchronized 关键字的替代方案。
// AQS 中
private volatile int state;