java多线程如何同步问题
Java多线程同步方法
使用synchronized关键字synchronized可以修饰方法或代码块,确保同一时间只有一个线程访问共享资源。修饰实例方法时,锁是当前实例;修饰静态方法时,锁是类的Class对象。
public synchronized void synchronizedMethod() {
// 同步代码
}
使用ReentrantLockReentrantLock是显式锁,提供更灵活的同步控制,支持公平锁、可中断锁等特性。
private final ReentrantLock lock = new ReentrantLock();
public void lockMethod() {
lock.lock();
try {
// 同步代码
} finally {
lock.unlock();
}
}
使用volatile关键字volatile保证变量的可见性,确保线程每次读取变量时都从主内存获取,而非缓存。适用于单一变量的原子操作。
private volatile boolean flag = false;
使用Atomic类AtomicInteger、AtomicLong等类提供原子操作,无需加锁即可保证线程安全。
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
使用CountDownLatch和CyclicBarrierCountDownLatch用于等待多个线程完成,CyclicBarrier让一组线程相互等待到达屏障点。
CountDownLatch latch = new CountDownLatch(3);
latch.await(); // 等待计数归零
latch.countDown(); // 计数减1
使用Semaphore
控制同时访问资源的线程数量,适用于限流场景。
Semaphore semaphore = new Semaphore(5);
semaphore.acquire(); // 获取许可
semaphore.release(); // 释放许可
使用ThreadLocal
为每个线程提供独立的变量副本,避免共享变量的问题。
private ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> "init");
threadLocal.set("value");
String value = threadLocal.get();
选择同步方法的依据
- 简单同步需求优先使用
synchronized或volatile。 - 需要更细粒度控制时选择
ReentrantLock。 - 高并发原子操作使用
Atomic类。 - 线程间协作使用
CountDownLatch、CyclicBarrier或Semaphore。 - 线程隔离数据使用
ThreadLocal。







