java如何控制并发
控制并发的方法
Java提供了多种机制来控制并发,确保线程安全和高效执行。以下是几种常用的方法:
使用synchronized关键字
synchronized关键字用于修饰方法或代码块,确保同一时间只有一个线程可以访问被保护的资源。
示例代码:
public synchronized void increment() {
count++;
}
或对代码块加锁:
public void increment() {
synchronized(this) {
count++;
}
}
使用Lock接口
java.util.concurrent.locks包中的Lock接口提供了更灵活的锁机制,例如ReentrantLock。
示例代码:

private final Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
使用原子类
java.util.concurrent.atomic包提供了原子类(如AtomicInteger),通过CAS(Compare-And-Swap)操作实现无锁线程安全。
示例代码:
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
使用线程安全集合
Java的并发包(java.util.concurrent)提供了线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等。
示例代码:

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1);
使用CountDownLatch
CountDownLatch用于等待多个线程完成操作后再继续执行主线程。
示例代码:
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
new Thread(() -> {
// 执行任务
latch.countDown();
}).start();
}
latch.await();
使用Semaphore
Semaphore用于控制同时访问资源的线程数量。
示例代码:
Semaphore semaphore = new Semaphore(3);
public void accessResource() {
try {
semaphore.acquire();
// 访问资源
} finally {
semaphore.release();
}
}
使用线程池
通过ExecutorService管理线程池,避免频繁创建和销毁线程的开销。
示例代码:
ExecutorService executor = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
// 执行任务
});
}
executor.shutdown();
选择合适的方法
- synchronized:简单易用,适用于低竞争场景。
- Lock:提供更灵活的锁控制,支持超时和中断。
- 原子类:适用于高性能无锁场景。
- 线程安全集合:简化多线程环境下的集合操作。
- CountDownLatch/Semaphore:适用于复杂的线程协作场景。
- 线程池:优化线程管理和资源利用率。
根据具体需求选择合适的并发控制机制,确保程序的性能和正确性。






