线程中的问题
线程交互是通过共享变量完成的,当线程之间没有交互时,开发多线程的应用程序就会变得简单很多。一旦发生了交互,很多诱发线程不安全(在多线程环境下不正确)的因素就会暴露出来。这些bug多和竞态条件、数据竞争、缓存变量有关。
1. 竞态条件
当计算的正确性取决于相对时间或者调度器所控制的多线程交叉时。就会发生竞态条件。
有以下两种类型的竞态条件。
- check-then-act
以下例子的“检查”是if (a == 10),“动作”是 b = a / 2。
if (a == 10) {
b = a / 2;
}
如果a和b都是局部变量自然多线程时是没有问题的。但是假设a和b是实例变量或者类静态变量。就会可能