java并发如何控制
控制Java并发的常见方法
使用synchronized关键字
synchronized是Java中最基础的同步机制,可以修饰方法或代码块,确保同一时间只有一个线程访问临界资源。
public synchronized void increment() {
count++; // 线程安全操作
}
public void increment() {
synchronized(this) {
count++; // 同步代码块
}
}
使用ReentrantLock
ReentrantLock提供更灵活的锁控制,支持公平锁、可中断锁和超时锁。
private final ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock(); // 确保锁释放
}
}
使用volatile关键字
volatile保证变量的可见性,但不保证原子性,适合单一变量的轻量级同步。
private volatile boolean flag = false;
使用原子类(AtomicInteger等)
java.util.concurrent.atomic包提供原子操作类,如AtomicInteger,适合无锁编程场景。
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // 原子操作
}
使用CountDownLatch
CountDownLatch用于等待多个线程完成任务后再继续主线程。
CountDownLatch latch = new CountDownLatch(3);
// 线程完成任务后调用
latch.countDown();
// 主线程等待
latch.await();
使用CyclicBarrier
CyclicBarrier让一组线程互相等待,到达屏障点后继续执行。
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("所有线程到达屏障");
});
// 线程调用
barrier.await();
使用Semaphore
Semaphore控制同时访问资源的线程数量,适合限流场景。
Semaphore semaphore = new Semaphore(3); // 允许3个线程同时访问
public void accessResource() throws InterruptedException {
semaphore.acquire();
try {
// 访问资源
} finally {
semaphore.release();
}
}
使用ThreadLocal
ThreadLocal为每个线程提供独立的变量副本,避免共享变量冲突。
private static ThreadLocal<Integer> threadLocalCount = ThreadLocal.withInitial(() -> 0);
public void increment() {
threadLocalCount.set(threadLocalCount.get() + 1);
}
使用并发集合
java.util.concurrent包提供线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
使用CompletableFuture
CompletableFuture支持异步编程和任务组合,简化多线程协作。

CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World")
.thenAccept(System.out::println);
选择合适的方法
- 简单同步:
synchronized或volatile。 - 复杂锁控制:
ReentrantLock。 - 无锁编程:原子类。
- 线程协作:
CountDownLatch、CyclicBarrier、Semaphore。 - 线程隔离:
ThreadLocal。 - 高性能集合:并发集合类。
- 异步任务:
CompletableFuture。






