[410] Re:synchronizedメソッドの“変なこと”
投稿者:本多
2007/02/20 02:13:25
>◎getとsetが分かれていたり…
~中略~
>ふたつのスレッドA, Bが以下のようにxをインクリメントしようとすると、
> x = p.getX(); // スレッドA ←(1)
> x = p.getX(); // スレッドB ←(2)
> p.setX(x+1); // スレッドA ←(3)
> p.setX(x+1); // スレッドB ←(4)
~中略~
>結局、マルチスレッドで正しくプログラムを動かしたいのであれば、
>Pointのような低レベルなクラスで、個々のメソッドに機械的にsynchronizedを
>つけても意味がなく、アプリケーションのレベルで対処しなければなりません。
~中略~
>あんまり理解されてないことなんですかねえ。
こういうのって、マルチスレッド プログラムで再現性の低いバグで悩んだ経験がないとなかなか思いつかないことかもしれませんね。
ずいぶん昔、私もマルチスレッドではないのですが、複数のCPUで一つのデバイスにアクセスするようなプログラムではまったことがあって、その原因はこんな行でした。
x |= y;
xの値をCPUレジスタに読み出して、その値にyの値を加えたものを、xに書き込む...前に別のCPUからxに書き込みがあったんです。
このときは高い確率で再現できるプログラムが偶然用意できたのが幸いでしたが。