在 Java 中,多线程同步的核心目的是:保证多个线程在访问共享资源时数据一致、不发生冲突。下面从常见方式、原理和使用场景系统地讲一下。
当多个线程 同时读写同一个变量 / 对象 时,可能出现:
示例问题:
class Counter {
int count = 0;
void inc() { count++; }
}
count++ 不是原子操作,多线程下会出错。
public synchronized void inc() {
count++;
}
private final Object lock = new Object();
public void inc() {
synchronized (lock) {
count++;
}
}
✅ 细粒度控制,性能更好
private volatile boolean flag = false;
作用:
❌ 不能替代 synchronized
✅ 适合状态标志
Lock lock = new ReentrantLock();
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
优点:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
✅ 高性能
✅ 无锁
❌ 仅适合简单变量
常见类:
ConcurrentHashMapCopyOnWriteArrayListBlockingQueuesynchronized (lock) {
while (condition) {
lock.wait();
}
// do something
lock.notify();
}
⚠️ 必须在 synchronized 内使用
| 场景 | 推荐方式 |
|---|---|
| 简单同步 | synchronized |
| 高性能计数 | Atomic |
| 复杂锁控制 | ReentrantLock |
| 状态标志 | volatile |
| 并发集合 | JUC 容器 |
❌ synchronized 一定能保证性能差
❌ volatile 能代替锁
❌ 多线程 = 快(不合理同步反而更慢)
如果你愿意,我可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。