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