最近有个需求需要用到线程池,第一次写也没有什么经验。这里记录些遇到的问题,以作记录。
1.int count 自增不是线程安全的
public class VerifyMain {
private static int count = 0;
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
count++;
}
}).start();
}
// 使线程执行完毕
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("count---" + count);
}
}
10个线程,每个线程循环1000次对 count 自增1,运行结果每次都不一样,并且都小于10000。
咨询了老王,说有个原子操作类AtomicInteger可以解决这个问题。
public class VerifyMain {
private static int count = 0;
private static AtomicInteger atomicInteger = new AtomicInteger(0);
public static void main(String[] args) {
Thread[] threads = new Thread[10];
for (int i = 0; i < threads.length; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
count++;
// incrementAndGet()增加1
atomicInteger.incrementAndGet();
}
}).start();
}
// 使线程执行完毕
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("count---" + count);
System.out.println("atomicInteger---" + atomicInteger);
}
}
执行结果:
AtomicInteger 还有很多其他的方法,可以实现自增、自减、比较更新等。
AtomicInteger 的其他方法,推荐博客