在 Java 中,多线程加锁的本质是控制对共享资源的并发访问,避免数据不一致。下面按常见程度和实用场景系统介绍几种方式。
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
public static synchronized void method() {
// 锁的是 Counter.class
}
private final Object lock = new Object();
public void method() {
synchronized (lock) {
// 临界区
}
}
✅ 优点:简单、JVM 自动加锁释放
❌ 缺点:不够灵活,不能中断、不能超时
import java.util.concurrent.locks.ReentrantLock;
ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 临界区
} finally {
lock.unlock();
}
}
lock.tryLock(); // 尝试获取锁
lock.tryLock(1, TimeUnit.SECONDS);
lock.lockInterruptibly(); // 可中断
✅ 优点:灵活、可中断、可定时
❌ 缺点:必须手动释放(忘了会死锁)
适合读多写少
ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
rwLock.readLock().lock(); // 多个线程可同时读
rwLock.writeLock().lock(); // 写时独占
使用 Atomic 类:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
✅ 无锁、性能高
❌ 只适合简单变量
ConcurrentHashMap
CopyOnWriteArrayList
BlockingQueue
大多数业务场景优先用并发容器
private volatile boolean flag;
✅ 保证可见性
❌ 不保证原子性(不能替代锁)
| 场景 | 推荐 |
|---|---|
| 简单同步 | synchronized |
| 需要超时/中断 | ReentrantLock |
| 读多写少 | ReadWriteLock |
| 计数/状态 | Atomic |
| 集合数据 | 并发容器 |
如果你有具体业务场景(比如库存、订单、缓存),我可以直接给你最优加锁方案 + 示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。