温馨提示×

温馨提示×

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

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

java多线程怎么同步

发布时间:2026-09-12 18:23:26 来源:亿速云 阅读:96 作者:小樊 栏目:编程语言

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


一、为什么需要同步

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

  • 丢失更新
  • 脏读
  • 不可重复读
  • 程序结果不确定

示例问题代码:

class Counter {
    int count = 0;
    void increment() {
        count++; // 非原子操作
    }
}

多个线程调用 increment() 可能结果小于预期。


二、常用同步方式

1️⃣ synchronized(最常用)

(1)同步方法

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }
}
  • 锁的是 当前对象 (this)
  • 同一时间只有一个线程能执行该方法

(2)同步代码块(更灵活)

class Counter {
    private int count = 0;
    private final Object lock = new Object();

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

✅ 推荐:锁粒度更小,性能更好


2️⃣ volatile(轻量级同步)

private volatile boolean flag = false;

作用:

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

适合:

  • 状态标志
  • 一写多读

❌ 不适合 count++ 这种复合操作


3️⃣ Lock 接口(JUC)

import java.util.concurrent.locks.ReentrantLock;

class Counter {
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();

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

优点:

  • 可中断
  • 可超时
  • 公平锁
  • 多条件变量

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

import java.util.concurrent.atomic.AtomicInteger;

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

✅ 高性能
✅ 线程安全
✅ 无锁

适合:

  • 计数器
  • 累加器

5️⃣ 线程安全容器(推荐)

避免手动同步:

ConcurrentHashMap
CopyOnWriteArrayList
BlockingQueue

示例:

ExecutorService pool = Executors.newFixedThreadPool(10);

三、经典同步工具(JUC)

工具 作用
CountDownLatch 等待多个线程完成
CyclicBarrier 线程相互等待
Semaphore 控制并发数
ReentrantLock 高级锁

四、选择建议

✅ 简单同步 → synchronized
✅ 高性能计数 → Atomic*
✅ 复杂控制 → Lock
✅ 数据共享 → 线程安全容器
❌ 不要过度同步(影响性能)


五、示例:线程安全计数器

class SafeCounter {
    private int count = 0;

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

    public synchronized int get() {
        return count;
    }
}

如果你愿意,我可以:

  • 给你画 线程同步流程图
  • 讲 死锁怎么避免
  • 写 面试常问同步题
  • 结合 实际业务场景示例

你更想了解哪一块?

向AI问一下细节

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

AI
助
手