温馨提示×

温馨提示×

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

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

java多线程怎样同步

发布时间:2026-10-24 02:38:01 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 中,多线程同步的核心目的是:保证多个线程在访问共享资源时数据一致、不发生冲突。下面从常见方式、原理和使用场景系统地讲一下。


一、为什么需要同步

当多个线程 同时读写同一个变量 / 对象 时,可能出现:

  • 脏读
  • 丢失更新
  • 不可重复读
  • 线程安全问题

示例问题:

class Counter {
    int count = 0;
    void inc() { count++; }
}

count++ 不是原子操作,多线程下会出错。


二、常用同步方式

1️⃣ synchronized(最常用)

(1)同步方法

public synchronized void inc() {
    count++;
}
  • 锁的是 当前对象(this)

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

private final Object lock = new Object();

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

✅ 细粒度控制,性能更好


2️⃣ volatile(轻量级同步)

private volatile boolean flag = false;

作用:

  • 保证 可见性
  • 不保证 原子性

❌ 不能替代 synchronized
✅ 适合状态标志


3️⃣ Lock(JUC,更灵活)

Lock lock = new ReentrantLock();

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

优点:

  • 可中断
  • 可超时
  • 公平锁
  • 多条件等待

4️⃣ 原子类(CAS,无锁)

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

✅ 高性能
✅ 无锁
❌ 仅适合简单变量

常见类:

  • AtomicInteger
  • AtomicLong
  • AtomicReference

5️⃣ 线程安全容器(避免手动同步)

  • ConcurrentHashMap
  • CopyOnWriteArrayList
  • BlockingQueue

三、线程间通信(wait / notify)

synchronized (lock) {
    while (condition) {
        lock.wait();
    }
    // do something
    lock.notify();
}

⚠️ 必须在 synchronized 内使用


四、选择建议

场景 推荐方式
简单同步 synchronized
高性能计数 Atomic
复杂锁控制 ReentrantLock
状态标志 volatile
并发集合 JUC 容器

五、常见误区

❌ synchronized 一定能保证性能差
❌ volatile 能代替锁
❌ 多线程 = 快(不合理同步反而更慢)


如果你愿意,我可以:

  • 给你一个 完整多线程示例
  • 讲 synchronized 原理(monitor)
  • 对比 Lock vs synchronized
  • 讲 死锁如何避免

你想深入哪一块?

向AI问一下细节

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

AI
助
手