データ競合
Javaにおいては、プログラムがhappens-before関係によって順序付けられていない2つの競合するアクセス(同じ共有変数に対する2つの読み書きアクセスのうち、少なくとも1つが書き込みであるようなアクセス)を含んでいるとき、データ競合を含んでいると言われる。
JavaScript (ECMAScript) において、read/writeイベントEとDが以下の条件を満たしている場合「EとDはデータ競合にある」と定義される。
EあるいはDに順序が定義されない(not SeqCst)
EとDが重複したrangeを有する(overlapping range)
データ競合と競合状態は、似て非なる概念である。データ競合のないプログラムであっても、競合状態がないとは限らない。たとえば共有変数自体に対する読み書きが排他制御もしくはアトミック操作によって保護されている場合、少なくとも書き込み途中の中途半端なデータが他のスレッドから読み取られることはない(データ競合は発生しない)が、変更される前の値を他のスレッドが読み取るか、それとも変更された後の値を読み取るかによって、その後のプログラムの動作が変わる可能性がある。
Rustではunsafeコードを使用しない限り、データ競合は発生しないことが保証される。しかし、競合状態の防止に関しては、より粒度の大きい排他制御を明示的に記述するなどの対処をする必要があり、それはプログラマの責任となる。