竞态条件(Race Condition):计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。html
最多见的竞态条件为编程
执行依赖于检测的结果,而检测结果依赖于多个线程的执行时序,而多个线程的执行时序一般状况下是不固定不可判断的,从而致使执行结果出现各类问题。安全
对于main线程,若是文件a不存在,则建立文件a,可是在判断文件a不存在以后,Task线程建立了文件a,这时候先前的判断结果已经失效,(main线程的执行依赖了一个错误的判断结果)此时文件a已经存在了,可是main线程仍是会继续建立文件a,致使Task线程建立的文件a被覆盖、文件中的内容丢失等等问题。多线程
多线程环境中对同一个文件的操做要加锁。并发
public class ObjFactory { private Obj instance; public Obj getInstance(){ if(instance == null){ instance = new Obj(); } return instance; } }
线程a和线程b同时执行getInstance(),线程a看到instance为空,建立了一个新的Obj对象,此时线程b也须要判断instance是否为空,此时的instance是否为空取决于不可预测的时序:包括线程a建立Obj对象须要多长时间以及线程的调度方式,若是b检测时,instance为空,那么b也会建立一个instance对象post
和大多数并发错误同样,竞态条件不老是会产生问题,还须要不恰当的执行时序
3、解决措施url