在 Java 中,多线程加锁主要用于保证共享资源的线程安全。下面按“从常见到进阶”的方式系统讲解。
synchronized(最常用、最简单)public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
Class 对象public void increment() {
synchronized (this) {
count++;
}
}
或锁指定对象:
private final Object lock = new Object();
public void method() {
synchronized (lock) {
// 临界区
}
}
✅ 优点:简单、自动释放锁
❌ 缺点:不够灵活(不能超时、不能中断)
ReentrantLock(更灵活)import java.util.concurrent.locks.ReentrantLock;
public class Counter {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
lock.tryLock(); // 尝试获取锁
lock.tryLock(1, TimeUnit.SECONDS);
lock.lockInterruptibly(); // 可中断
✅ 优点:灵活、可中断、可超时
❌ 缺点:必须手动释放锁
ReentrantReadWriteLock适合 读多写少
ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
rwLock.readLock().lock(); // 多个线程可同时读
rwLock.writeLock().lock(); // 写时独占
支持乐观读:
StampedLock lock = new StampedLock();
long stamp = lock.tryOptimisticRead();
if (!lock.validate(stamp)) {
stamp = lock.readLock();
}
不用“锁”,用比较并交换:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
✅ 高性能、无阻塞
❌ 适合简单变量操作
ConcurrentHashMapCopyOnWriteArrayListBlockingQueueObject lock = new Object();
lock = new Object(); // 错误
锁范围过大(性能差)
忘记释放锁(ReentrantLock)
| 场景 | 推荐 |
|---|---|
| 简单同步 | synchronized |
| 需要超时/中断 | ReentrantLock |
| 读多写少 | ReadWriteLock |
| 高性能计数 | Atomic / CAS |
| 容器并发 | 并发集合 |
如果你愿意,可以告诉我:
我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。