java如何线程同步
线程同步的基本概念
在多线程环境中,当多个线程访问共享资源时,可能导致数据不一致或竞态条件。线程同步是确保线程安全访问共享资源的机制。Java提供了多种同步方式,包括内置锁、显式锁、原子类等。
synchronized关键字
synchronized是Java中最基础的同步机制,可用于方法或代码块:
- 同步实例方法:锁对象是当前实例(
this)。public synchronized void method() { // 同步代码 } - 同步静态方法:锁对象是类的
Class对象。public static synchronized void staticMethod() { // 同步代码 } - 同步代码块:需指定锁对象(可以是任意对象)。
public void block() { synchronized (lockObject) { // 同步代码 } }
ReentrantLock显式锁
ReentrantLock是java.util.concurrent.locks包中的显式锁,提供更灵活的同步控制:

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),通过CAS(Compare-And-Swap)实现无锁线程安全:

private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet(); // 原子操作
}
线程安全的集合类
Java提供并发集合类(如ConcurrentHashMap、CopyOnWriteArrayList),无需额外同步:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1); // 线程安全操作
信号量(Semaphore)
控制同时访问资源的线程数量:
Semaphore semaphore = new Semaphore(3); // 允许3个线程同时访问
public void accessResource() throws InterruptedException {
semaphore.acquire();
try {
// 访问资源
} finally {
semaphore.release();
}
}
CountDownLatch和CyclicBarrier
- CountDownLatch:等待一组线程完成后再执行。
CountDownLatch latch = new CountDownLatch(3); latch.await(); // 等待计数归零 latch.countDown(); // 减少计数 - CyclicBarrier:线程互相等待,到达屏障后继续执行。
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("All threads reached")); barrier.await(); // 线程等待
注意事项
- 避免死锁:确保锁的获取顺序一致。
- 减少锁粒度:同步代码块应尽量简短。
- 优先使用并发工具类(如
ConcurrentHashMap)而非手动同步。






