欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java多线程安全的计数器

程序员文章站 2022-06-27 16:19:54
1.示例代码package com.multithread;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicInteger;/** * @author: liminghui * @date: 2020/11/...

1.示例代码

package com.multithread;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author: liminghui
 * @date: 2020/11/21 10:19
 * @version: 1.0
 * @description:
 */
public class Counter2 {
    static AtomicInteger atomicInteger = new AtomicInteger(0);
    static int count = 0;
    static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(10);

    public static void main(String[] args) throws InterruptedException {

        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            Runnable runnable = new Runnable() {
                public void run() {
                    for (int j = 0; j < 10000; j++) {
                        count++;
                        // safeCount();
                        atomicInteger.incrementAndGet();
                    }
                    // 完成一个线程任务计数器减一
                    COUNT_DOWN_LATCH.countDown();
                }
            };
            executorService.execute(runnable);
        }
        // 等待所有线程执行完成
        COUNT_DOWN_LATCH.await();
        executorService.shutdown();

        System.out.println(count);
        System.out.println(atomicInteger.get());
    }

    /**
     * 使用CAS实现线程安全的计数器
     */
    private void safeCount() {
        for (; ; ) {
            int i = atomicInteger.get();
            boolean suc = atomicInteger.compareAndSet(i, ++i);
            if (suc) {
                break;
            }
        }
    }

    /**
     * 非线程安全的计数器
     */
    private void count() {
        count++;
    }
}

2.注意计数器的使用,COUNT_DOWN_LATCH.countDown();的位置,是在run方法最后

3.运行结果

32914
100000

本文地址:https://blog.csdn.net/liminghui4321/article/details/109892815