Java体现
两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次,结果是0吗?
问题分析:以上的结果可能是正数、负数、零,为什么呢?因为Java中对静态变量的自增、自减并不是原子操作,要彻底理解,必须从字节码来进行分析。
例如对i++而言(i为静态变量),实际上会产生如下的JVM字节码指令:
而对应i--也是类似:
而Java的内存模型如下,完成静态变量的自增、自减需要在主存和工作内存中进行数据交换:
如果是单线程执行以上代码是顺序执行没有问题:
多线程执行以上代码出现负数的情况:
多线程执行以上代码出现正数的情况:
临界区
一个程序运行多个线程本身是没有问题的
问题出现在多个线程访问共享资源
- 多个线程读共享资源其实也没有问题
- 在多个线程对共享资源读写操作时发生指令交错,就会出现问题
一般代码块内如果存在对共享资源的多线程读写操作,就称这段代码为临界区
竞态条件
多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竟态条件