環境によるけど32ビットを超える大きさの値(doubleや構造体)は
書き換え操作や読み取り操作が分割される可能性があるので、あるスレッドが値を書き換えている途中に
別のスレッドが同じ変数を読み出すと間違った値が読み出される。
>>171はたまたまロックが必要ないけど、ロックしなくていいかどうかはとってもデリケートな問題なので、
複数のスレッドから使われる変数にアクセスするときは基本的には常にロックが必要と考えてもいい。
boolでも flag = !flag とかはロックが必要。