温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java多线程如何同步

发布时间:2026-09-12 20:33:25 来源:亿速云 阅读:105 作者:小樊 栏目:编程语言

在 Java 中,多线程同步的核心目的是:保证多个线程在访问共享资源时,数据的一致性和线程安全。下面从常见方式到原理给你系统梳理一下。


一、为什么需要同步

当多个线程同时:

  • 读取并修改同一个变量
  • 操作共享集合、文件、数据库连接等

就可能出现:

  • 脏读
  • 丢失更新
  • 不可重复读
  • 死锁等问题

二、Java 中常用的同步方式

1️⃣ synchronized(最基础、最常用)

(1)同步方法

public synchronized void add() {
    count++;
}
  • 锁的是 当前对象(this)
  • 静态方法锁的是 Class 对象

(2)同步代码块(更推荐)

private final Object lock = new Object();

public void add() {
    synchronized (lock) {
        count++;
    }
}

✅ 优点:粒度更小,性能更好


2️⃣ volatile(轻量级同步)

private volatile boolean flag = false;

作用:

  • 保证 可见性
  • 禁止指令重排序

❌ 不能保证原子性(如 i++ 不安全)

适用于:

  • 状态标志
  • 单例双重检查

3️⃣ Lock 接口(更灵活)

Lock lock = new ReentrantLock();

lock.lock();
try {
    count++;
} finally {
    lock.unlock();
}

相比 synchronized:

  • 可中断
  • 可超时
  • 可公平锁
  • 可尝试获取锁

4️⃣ ReentrantLock 常用功能

lock.tryLock(1, TimeUnit.SECONDS);
lock.lockInterruptibly();

5️⃣ 原子类(无锁高效)

AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();

常用类:

  • AtomicInteger
  • AtomicLong
  • AtomicReference

✅ 基于 CAS(Compare And Swap) ✅ 高并发下性能优于锁


6️⃣ 并发集合(避免手动同步)

List<Integer> list = Collections.synchronizedList(new ArrayList<>());

或更好:

List<Integer> list = new CopyOnWriteArrayList<>();

常见:

  • ConcurrentHashMap
  • BlockingQueue
  • CopyOnWriteArrayList

7️⃣ wait / notify / notifyAll(线程协作)

synchronized (lock) {
    while (conditionNotOk) {
        lock.wait();
    }
    // do something
    lock.notifyAll();
}

⚠️ 必须在 synchronized 中使用


8️⃣ CountDownLatch / CyclicBarrier / Semaphore

用于线程间控制:

CountDownLatch latch = new CountDownLatch(3);
latch.await();
latch.countDown();

三、如何选择同步方式?

场景 推荐方式
简单方法同步 synchronized
高并发计数 Atomic*
复杂锁控制 ReentrantLock
共享集合 并发容器
线程通信 wait/notify 或 Lock + Condition

四、常见坑 ⚠️

  1. synchronized 锁对象不能是 String 常量
  2. 锁范围过大影响性能
  3. volatile 不能替代锁
  4. 死锁(互相等待)

如果你愿意,我可以:

  • 给你 示例代码
  • 讲 死锁怎么避免
  • 或结合 面试角度 总结

你想深入哪一块?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手