Java并发优化
并发问题分析
flowchart TD
subgraph 并发问题
race[竞态条件]
deadlock[死锁]
livelock[活锁]
resource[资源耗尽]
end
锁优化技巧
-
减少锁粒度:
// 粗粒度锁 synchronized(this) { // 所有操作 } // 细粒度锁 synchronized(accountLock) { // 账户操作 }
-
锁分离:
// 读写锁分离 ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); Lock readLock = lock.readLock(); Lock writeLock = lock.writeLock();
并发工具使用
// 1. CountDownLatch
CountDownLatch latch = new CountDownLatch(3);
// 工作线程
latch.countDown();
// 主线程
latch.await();
// 2. CyclicBarrier
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
// 所有线程到达后执行
});
// 3. CompletableFuture
CompletableFuture.supplyAsync(() -> fetchData())
.thenApply(this::processData)
.thenAccept(this::saveData);
线程池调优
// 自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // 核心线程数
Runtime.getRuntime().availableProcessors() * 2, // 最大线程数
60, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000),
new ThreadPoolExecutor.CallerRunsPolicy()
);
// 监控参数:
- activeCount
- queueSize
- completedTaskCount
无锁编程
// 1. CAS操作
AtomicInteger counter = new AtomicInteger();
counter.incrementAndGet();
// 2. LongAdder
LongAdder adder = new LongAdder();
adder.increment();
// 3. ConcurrentHashMap
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
map.computeIfAbsent("key", k -> createValue(k));
最佳实践
- 优先使用并发集合
- 避免锁嵌套
- 合理设置线程池参数
- 考虑使用异步编程
- 监控线程状态