java如何同步
同步的基本概念
在Java中,同步用于控制多线程对共享资源的访问,防止数据不一致或竞态条件。常见的同步机制包括synchronized关键字、ReentrantLock、volatile变量以及并发工具类。
使用synchronized关键字
synchronized可以修饰方法或代码块,确保同一时间只有一个线程能执行被保护的代码。
同步方法
public synchronized void method() {
// 线程安全的代码
}
同步代码块

public void method() {
synchronized (this) { // 锁对象可以是任意实例或类对象
// 线程安全的代码
}
}
使用ReentrantLock
ReentrantLock是java.util.concurrent.locks提供的显式锁,比synchronized更灵活,支持公平锁和可中断锁。
private final ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 线程安全的代码
} finally {
lock.unlock(); // 确保锁释放
}
}
使用volatile变量
volatile保证变量的可见性,但不保证原子性。适用于单线程写、多线程读的场景。
private volatile boolean flag = false;
public void setFlag() {
flag = true; // 写操作对其他线程立即可见
}
并发工具类
Java提供了java.util.concurrent包中的高级同步工具:

-
AtomicInteger/AtomicLong:原子操作类。private AtomicInteger counter = new AtomicInteger(0); public void increment() { counter.incrementAndGet(); } -
CountDownLatch:等待多个线程完成。CountDownLatch latch = new CountDownLatch(3); latch.await(); // 阻塞等待计数归零 latch.countDown(); // 计数减1 -
Semaphore:控制资源访问的并发数。Semaphore semaphore = new Semaphore(3); semaphore.acquire(); // 获取许可 semaphore.release(); // 释放许可
选择同步策略
- 简单场景优先使用
synchronized。 - 需要超时或中断功能时选择
ReentrantLock。 - 仅需可见性时使用
volatile。 - 高并发场景考虑
Atomic类或并发工具类。
注意避免死锁,确保锁的粒度合理,减少同步块的长度以提高性能。






