
这里是Themberfue
· 在上一节的最后,我们讨论两个线程同时对一个变量累加所产生的现象
· 在这一节中,我们将更加详细地解释这个现象背后发生的原因以及该如何解决这样类似的现象
线程安全问题
public class Demo15 {
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 50000; i++) {
count++;
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 50000; i++) {
count++;
}
});
// "线程安全问题"
// 会照成 "线程不安全问题"
// t1.start();
// t2.start();
// t1.join();
// t2.join();
// 改为串行执行
t1.start();
t1.join();
t2.start();
t2.join();
System.out.println(count);
}
}
· 我们先回顾上述代码,如果两个线程并发执行逻辑,同时累加 count 变量 100,000 次后,得到的结果是一个随机值,且这个随机值一定小于 100,000
· 如果改为串行执行,就是 t1 执行完后,t2 再度执行,那么 count 的结果就为 100,000
· 为什么会产生这样的现象?
· 我们先从一行代码入手:count++,有的人就会问:这有什么好分析的,这不就是一个count + 1的操作吗?没错,的确是这样
· 众所周知:CPU(中央处理器)执行的是一系列指令,这些指令定义了它需要执行的逻辑操作,这些指令的集合统称为指令集,指令集有两种,一种是..... (再讲就串台了,这是计算机组成原理的知识哦)
· 常见的指令就有逻辑指令,算术指令等,那么,一个 count++ 其实分为三个指令操作,因为它还设计到变量的修改,而不是单纯地加法
· 我们都知道,把大象放进冰箱分三步:把把冰箱门打开,把大象装进去,再把冰箱门关上
· count++ 也分为三步操作:
1. load:把内存中 count 的值,加载到 cpu 寄存器<

1万+

被折叠的 条评论
为什么被折叠?



