在 Java 中,多线程同步的核心目的是:保证多个线程在访问共享资源时,数据的一致性和线程安全。下面从常见方式到原理给你系统梳理一下。
当多个线程同时:
就可能出现:
synchronized(最基础、最常用)public synchronized void add() {
count++;
}
private final Object lock = new Object();
public void add() {
synchronized (lock) {
count++;
}
}
✅ 优点:粒度更小,性能更好
volatile(轻量级同步)private volatile boolean flag = false;
作用:
❌ 不能保证原子性(如 i++ 不安全)
适用于:
Lock 接口(更灵活)Lock lock = new ReentrantLock();
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
相比 synchronized:
ReentrantLock 常用功能lock.tryLock(1, TimeUnit.SECONDS);
lock.lockInterruptibly();
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
常用类:
AtomicIntegerAtomicLongAtomicReference✅ 基于 CAS(Compare And Swap) ✅ 高并发下性能优于锁
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
或更好:
List<Integer> list = new CopyOnWriteArrayList<>();
常见:
ConcurrentHashMapBlockingQueueCopyOnWriteArrayListwait / notify / notifyAll(线程协作)synchronized (lock) {
while (conditionNotOk) {
lock.wait();
}
// do something
lock.notifyAll();
}
⚠️ 必须在 synchronized 中使用
CountDownLatch / CyclicBarrier / Semaphore用于线程间控制:
CountDownLatch latch = new CountDownLatch(3);
latch.await();
latch.countDown();
| 场景 | 推荐方式 |
|---|---|
| 简单方法同步 | synchronized |
| 高并发计数 | Atomic* |
| 复杂锁控制 | ReentrantLock |
| 共享集合 | 并发容器 |
| 线程通信 | wait/notify 或 Lock + Condition |
synchronized 锁对象不能是 String 常量volatile 不能替代锁如果你愿意,我可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。