/**
* i++操作本身包含了多个步骤:
* 加载i到内存中(CPU寄存器或者缓存中)
* 进行加1操作
* 保存结果回内存变量i
* 在单线程情况下,这三步操作是原子性的,一个一个进行,不会有问题。
* 但是在多线程情况下,如果有两个线程同时执行i++操作,可能会出现以下问题:
* 线程A加载i到内存(假设当前i为1)
* 线程B也加载i到内存(也是1)
* 线程A进行加1操作,i变为2
* 线程B也进行加1操作,i也变为2
* 线程A保存结果2回i
* 线程B也保存结果2回i
* 最终i只加1,而不是理论上的2。
*/
public class Test {
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for(int j=0; j<10000; j++) {
count ++ ;
}
});
Thread t2 = new Thread(() -> {
for(int j=0; j<10000; j++) {
count ++ ;
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(count);
}
}
i++是线程安全的吗?
猜你喜欢
转载自blog.csdn.net/xuan__xia/article/details/134874191
今日推荐
周排行