1. 并发编程的考古与演进
最近在整理技术笔记时,翻出了十年前写的并发编程代码,不禁感慨技术演进的快速。那些曾经引以为傲的同步锁设计,如今看来就像出土文物般充满时代感。这促使我系统梳理了并发编程的发展脉络,也发现了一些值得分享的思考。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 并发模型的演进历程
2.1 石器时代:原始同步机制
早期Java开发者最熟悉的莫过于synchronized关键字。记得2010年做支付系统时,我们会在关键方法上加这个修饰符,简单粗暴但有效:
java复制public synchronized void transfer(Account from, Account to, BigDecimal amount) {
// 转账逻辑
}
这种方式的典型问题是:
- 锁粒度太粗导致性能瓶颈
- 容易产生死锁(特别是跨方法调用时)
- 无法设置超时时间
2.2 青铜时代:显式锁的出现
Java 5引入的java.util.concurrent包带来了更灵活的Lock接口。我们项目在2013年重构时全面改用ReentrantLock:
java复制private final Lock lock = new ReentrantLock();
public void transfer(Account from, Account to, BigDecimal amount) {
lock.lock();
try {
// 转账逻辑
} finally {
lock.unlock();
}
}
改进点包括:
- 可中断的锁获取
- 超时尝试
- 公平性设置
- 条件变量支持
2.3 铁器时代:原子变量与CAS
随着硬件发展,基于CAS(Compare-And-Swap)的原子类开始流行。我们在2015年做高频交易系统时,AtomicLong成为计数器的最佳选择:
java复制private AtomicLong counter = new AtomicLong(0);
public void increment() {
counter.incrementAndGet();
}
优势显而易见:
- 无锁设计提升吞吐量
