java 如何线程同步
线程同步的基本概念
线程同步用于控制多个线程对共享资源的访问,避免数据不一致或竞态条件。Java提供了多种机制实现线程同步。
synchronized 关键字
使用synchronized修饰方法或代码块,确保同一时间只有一个线程执行该代码:
public synchronized void synchronizedMethod() {
// 线程安全代码
}
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;
原子类
java.util.concurrent.atomic包提供原子变量类(如AtomicInteger),适合计数器等场景:
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
阻塞队列
BlockingQueue(如ArrayBlockingQueue)实现生产者-消费者模式,内部已处理同步:
BlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
// 生产者
queue.put("item");
// 消费者
String item = queue.take();
CountDownLatch 和 CyclicBarrier
-
CountDownLatch等待一组操作完成:CountDownLatch latch = new CountDownLatch(3); // 线程调用 latch.countDown() 减计数 latch.await(); // 阻塞直到计数归零 -
CyclicBarrier让多个线程相互等待:CyclicBarrier barrier = new CyclicBarrier(3); barrier.await(); // 线程阻塞直到所有线程到达
Semaphore
控制同时访问资源的线程数量:

Semaphore semaphore = new Semaphore(3);
semaphore.acquire(); // 获取许可
semaphore.release(); // 释放许可
选择同步机制的注意事项
- 简单同步优先使用
synchronized或volatile。 - 需要超时或中断控制时选择
ReentrantLock。 - 高并发计数场景使用原子类。
- 线程间协作使用
BlockingQueue或CountDownLatch等工具。






