スレッド化が完全に機能する場合、「x」の最大値は15です。これはすべてオペレーティングシステムのスケジューラーによって異なります。
xの初期値を0と仮定していることに注意してください。スレッドAとスレッドBがシリアル化されているとしましょう。スレッドAが完了した後のxの値は5になります。
i | x
-------
0 | 1
1 | 2
2 | 3
3 | 4
4 | 5
スレッドBに入るxの値は5になり、結果としてxは15の最終値になります。
i | x
-------
0 | 7
1 | 9
2 | 11
3 | 13
4 | 15
現在、この方法では通常、事態は発生せず、スレッドはxの初期値を読み取り、それらを加算してから、変更された値をメモリに書き戻します。次のことが発生する可能性があります。
Thread A reads the value 'x' as 0
Thread B reads the value 'x' as 0
Thread A adds 1 to x making its local copy of x, 1
Thread B adds 2 to x making its local copy of x, 2
Thread A writes its modified value of x as 1
Thread B writes its modified value of x as 2 (overwriting Thread A's modification)
したがって、xは15以下になりますが、スケジューラーによってはそれより少なくなります。