跳转至
用户认证 - eMac Tech Docs

用户认证

重要提醒

为了您的权益以及学习体验,请不要外借账号!

如果您没有账号或忘记密码,请联系管理员重置密码。

请输入您的登录信息

Java并发优化

并发问题分析

flowchart TD
    subgraph 并发问题
        race[竞态条件]
        deadlock[死锁]
        livelock[活锁]
        resource[资源耗尽]
    end

锁优化技巧

  1. 减少锁粒度

    // 粗粒度锁
    synchronized(this) {
        // 所有操作
    }
    
    // 细粒度锁
    synchronized(accountLock) {
        // 账户操作
    }
    

  2. 锁分离

    // 读写锁分离
    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));

最佳实践

  1. 优先使用并发集合
  2. 避免锁嵌套
  3. 合理设置线程池参数
  4. 考虑使用异步编程
  5. 监控线程状态