一个线程不安全的计数器
package com.thread.xgb;
public class UnsafeCounter {
public int count = 0;
public void add() {
count++;
}
public int get() {
return count;
}
}
编写一个简单的测试用例来验证它在多线程环境下是线程不安全的,这里用到了线程池和 J.U.C 包中的 CountDownLatch,使用线程池开启 100 个线程去执行 add() 累加操作,使用 CountDownLatch 的目的是为了保证打印最后结果的时候,100 个执行累加计数的线程已经先于主线程打印操作完成。关于线程池和 CountDownLatch 用法不太了解的读者,请自行查阅相关资料学习,这部分不是本文重点,不多赘述。
public static void main(String[] args) throws InterruptedException {
UnsafeCounter uc = new UnsafeCounter();
ExecutorService executorService = Executors.newCachedThreadPool();
// 设置 CountDownLatch 的计数器为 100,保证在主线程打印累加结果之前,100 个线程已经执行完累加
CountDownLatch cdl = new CountDownLatch(100);
for(int i = 0; i <