当访问共享资源的多线程(或其他并行)代码可能以导致意外结果的方式执行时,存在“竞争条件”。举个例子:for ( int i = 0; i < 10000000; i++ ){
x = x + 1; }如果您有5个线程同时执行此代码,则x WOULD NOT的值最终为50,000,000。事实上,每次运行都会有所不同。这是因为,为了使每个线程增加x的值,它们必须执行以下操作:(简化,显然)检索x的值将1添加到此值将此值存储到x任何线程都可以随时处于此过程的任何步骤,并且当涉及共享资源时,它们可以相互踩踏。在读取x和写回x之间的时间内,x的状态可以由另一个线程改变。假设一个线程检索x的值,但尚未存储它。另一个线程也可以检索相同的x值(因为还没有线程改变它),然后它们都将相同的值(x + 1)存储回x!例:线程1:读取x,值为7线程1:将x加1,值现为8线程2:读取x,值为7线程1:在x中存储8线程2:将x加1,值现为8线程2:在x中存储8通过在访问共享资源的代码之前使用某种锁定机制可以避免竞争条件:for ( int i = 0; i < 10000000; i++ ){
//lock x
x = x + 1;
//unlock x}在这里,答案每次都是50,000,000。