マルチスレッド絡みのエラー

multithread-error.png

沢山のスレッドから必要とされて困っちゃう〜

いつのまにか値が変わってる!

値がいつの間にか書き変わってしまったり、そんなことが起きませんか?
別のスレッドから勝手に値が書き換えられた可能性があります。
普通にマルチスレッドを使っていてまず遭遇するのが、「いつの間にか値が変わってる!」しかもそれは、「起きたり起きなかったりする」そういう類いのエラーです。
これらの問題は、いつの間にか値が変わってるオブジェクトに対して上手に同期をとったり、
そもそも無駄にスレッドを走らせないなどの工夫をすることによって解決します。

いつのまにか値が変わってる!のエラーの突き止め方

スレッドの名前を出力する

Thread.currentThread.getName();//現在のスレッドの名前の文字列を取得

関数の呼ばれ元を出力する

デバッガで止めて、関数の呼ばれ経由をチェックすることもできますが、
重いデバッガーを使うよりもっと雑で簡単な方法があります。
printStackTrace()を使って出力させることです

throw new Exception();
//そしてどこかでキャッチする
catch(Exception e){
e.printStackTrace();
}

Exceptionをがんがん出してもアプリが止まるわけじゃないのでテストコードとしてはok

synchronizedで囲みすぎてかたまる

いつの間にか値が変わらないように、とりあえずsynchronizedで囲みまくってみた!!
そしたら、次はどんなトラブルに巻き込まれうるかというと、
かたまる。。!!
という現象です。
synchronizedで囲む範囲が広すぎると、競合してプログラムが固まることがあります。
synchronizedで囲む範囲はなるべく狭くしましょう。
どのくらいで囲むのが適切なのかはsynchronizedで囲む範囲のページを参考に。

サポートサイト Wikidot.com