Skip to content

100个线程各累加100次

题目

100个线程, 每个线程累加100次, 并保证线程安全;

解法一

基本思路

  1. 使用 Java 自带的 conccruent 工具包中的 AtomicInteger 原子类, 调用其incrementAndGet() 方法可以保证线程安全的进行累加;
  2. 因为涉及到100个线程, 可以使用 FixedThreadPool 线程池来管理;
  3. 线程池使用之后, 需要注意关闭;

实现代码

java
public class ThreadsAccumulate {

    // 计数器 原子类
    private static final AtomicInteger COUNTER = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        // 创建线程数为100的线程池
        ExecutorService executor = Executors.newFixedThreadPool(100);
        // 提交一百个任务 每个任务执行100次
        for (int i = 0; i < 100; i++) {
            executor.submit(() -> {
                for (int j = 0; j < 100; j++) {
                    // 使用原子操作递增 线程安全
                    COUNTER.incrementAndGet();
                }
            });
        }
        // 关闭线程池 不接受新的任务 但会继续处理处理等待队列中的任务
        executor.shutdown();
        // 等待所有任务完成 保证任务执行结束
        executor.awaitTermination(1, TimeUnit.HOURS);
        // 输出最终计数值
        System.out.println(COUNTER.get());
    }

}