java多线程如何同步
多线程同步方法
在Java中,多线程同步主要通过以下几种机制实现,确保线程安全并避免竞态条件。
synchronized关键字
使用synchronized修饰方法或代码块,确保同一时间只有一个线程可以访问共享资源。
public synchronized void synchronizedMethod() {
// 线程安全的代码
}
public void method() {
synchronized(this) {
// 线程安全的代码块
}
}
ReentrantLock类
ReentrantLock提供了比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();
}
CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作。
CountDownLatch latch = new CountDownLatch(3);
// 线程中调用
latch.countDown();
// 主线程等待
latch.await();
CyclicBarrier
CyclicBarrier让一组线程互相等待,达到屏障点时继续执行。
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
// 所有线程到达后执行
});
// 线程中调用
barrier.await();
Semaphore
Semaphore控制同时访问资源的线程数量,适用于限流场景。
Semaphore semaphore = new Semaphore(3);
public void method() throws InterruptedException {
semaphore.acquire();
try {
// 限制并发的代码
} finally {
semaphore.release();
}
}
线程安全集合
java.util.concurrent包提供了线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
ThreadLocal
ThreadLocal为每个线程提供独立的变量副本,避免共享变量的问题。
private ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
public void method() {
threadLocal.set(threadLocal.get() + 1);
}
选择同步机制的考虑因素
- 性能:
synchronized在低竞争时性能较好,高竞争时ReentrantLock更优。 - 灵活性:
ReentrantLock支持尝试锁、超时锁等高级功能。 - 场景需求:根据具体需求选择锁、信号量、屏障等不同机制。
- 复杂度:原子类和线程安全集合简化了同步的实现。
通过合理选择同步机制,可以有效解决多线程环境下的数据一致性和线程安全问题。







