java 如何同步
同步的基本概念
在 Java 中,同步用于控制多线程对共享资源的访问,避免数据不一致或竞态条件。常见的同步机制包括 synchronized 关键字、ReentrantLock、volatile 变量以及并发工具类。
使用 synchronized 关键字
synchronized 是 Java 内置的同步机制,可以修饰方法或代码块,确保同一时间只有一个线程执行被保护的代码。
同步方法
public synchronized void synchronizedMethod() {
// 线程安全的代码
}
同步代码块
public void method() {
synchronized (this) {
// 线程安全的代码
}
}
使用 ReentrantLock
ReentrantLock 是 java.util.concurrent.locks 包中的显式锁,提供更灵活的同步控制。
import java.util.concurrent.locks.ReentrantLock;
private final ReentrantLock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 线程安全的代码
} finally {
lock.unlock();
}
}
使用 volatile 变量
volatile 确保变量的可见性,但不保证原子性。适用于单个变量的简单同步场景。
private volatile boolean flag = false;
使用原子类
java.util.concurrent.atomic 包提供原子类(如 AtomicInteger),适合无锁编程场景。
import java.util.concurrent.atomic.AtomicInteger;
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
使用并发集合
java.util.concurrent 包提供线程安全的集合类(如 ConcurrentHashMap),避免显式同步。

import java.util.concurrent.ConcurrentHashMap;
private ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
选择同步机制的考虑因素
- 性能:
synchronized在低竞争场景下性能较好,ReentrantLock在高竞争场景下更灵活。 - 功能需求:
ReentrantLock支持公平锁、可中断锁等高级功能。 - 代码复杂度:原子类和并发集合可以减少显式同步的代码量。
通过合理选择同步机制,可以有效解决多线程环境下的资源共享问题。






