java如何实现同步
Java 同步的实现方法
Java 提供了多种机制来实现线程同步,确保多线程环境下数据的一致性和线程安全。
使用 synchronized 关键字
synchronized 是 Java 中最基本的同步机制,可以用于方法或代码块。
同步方法
public synchronized void synchronizedMethod() {
// 同步代码
}
同步代码块
public void method() {
synchronized (this) {
// 同步代码
}
}
使用 ReentrantLock
ReentrantLock 是 java.util.concurrent.locks 包中的一个类,提供了比 synchronized 更灵活的锁机制。
import java.util.concurrent.locks.ReentrantLock;
public class Example {
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、AtomicLong),适合简单的原子操作。
import java.util.concurrent.atomic.AtomicInteger;
public class Example {
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
}
使用 CountDownLatch、CyclicBarrier 或 Semaphore
这些工具类适用于更复杂的同步场景。
CountDownLatch 示例
import java.util.concurrent.CountDownLatch;
public class Example {
private final CountDownLatch latch = new CountDownLatch(3);
public void await() throws InterruptedException {
latch.await();
}
public void countDown() {
latch.countDown();
}
}
使用 ThreadLocal
ThreadLocal 为每个线程提供独立的变量副本,避免共享变量的同步问题。
public class Example {
private ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
public void setValue(int value) {
threadLocal.set(value);
}
public int getValue() {
return threadLocal.get();
}
}
选择同步方法的依据
- 简单同步:优先使用
synchronized。 - 灵活锁控制:使用
ReentrantLock。 - 可见性需求:使用
volatile。 - 原子操作:使用原子类。
- 复杂同步场景:使用
CountDownLatch、CyclicBarrier或Semaphore。 - 线程隔离:使用
ThreadLocal。







