背景
核心矛盾
CPU/内存/IO设备的速度差异
解决思路
- 计算机体系结构——CPU 增加了缓存,以均衡与内存的速度差异
- 操作系统——操作系统增加了进程、线程,以分时复用 CPU,进而均衡 CPU 与 I/O 设备的速度差异
- 编译程序——编译程序优化指令执行次序,使得缓存能够得到更加合理地利用
异常根源
天下没有免费的午餐,并发程序很多诡异问题的根源也对应着上述解决思路。
cpu缓存导致的可见性问题
可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到
硬件程序员给软件程序员挖的坑~ 不同线程可能会对应不同cpu以及其不同的缓存。
public class Test {
private long count = 0;
private void add10K() {
int idx = 0;
while(idx++ < 10000) {
count += 1;
}
}
public static long calc() throws InterruptedException {
final Test test = new Test();
// 创建两个线程,执行add()操作
Thread th1 = new Thread(test::add10K);
Thread th2 = new Thread(test::add10K);
// 启动两个线程
th1.start();
th2.start();
// 等待两个线程执行结束
th1.join();
th2.join();
return test.count;
}
public static void main(String[] args) throws InterruptedException {
System.out.println(Test.calc());
}
}
值为10000-20000之间都随机数,因为
标签:缓存,Thread,编程,CPU,并发,test,线程,Test,BUG From: https://www.cnblogs.com/kiper/p/17195884.html