import java.util.ArrayList;
import java.util.List;
public class Main {
// ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
int i;
public void increment() {
i++;
}
public static void main(String[] args) {
Main main = new Main();
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
main.increment();
System.out.println(main.i);
}
}
};
List<Thread> threads = new ArrayList<>(10);
for (int i = 0; i < 3; i++) {
Thread thread = new Thread(runnable);
threads.add(thread);
thread.start();
}
boolean flag = false;
while (!flag) {
flag = true;
for (Thread thread : threads) {
if (thread.isAlive()) {
flag = false;
}
}
}
System.out.println(main.i);
}
}
对于这个for循环中的System.out.println(main.i);
加上了这句话之后,每次输出的结果都是30000,这是为什么
不是线程安全是一定的,使用30,300个线程试试就知道了,让你产生安全的错觉在
System.out.println
是一个耗时的同步方法,就是它在很大程度上掩盖了i++
的可见性和原子性的问题。使用AtomicInteger
或synchronized
吧