【初心者】Java質問・相談スレッド82【大歓迎】
■ このスレッドは過去ログ倉庫に格納されています
0497デフォルトの名無しさん
2006/03/05(日) 22:41:59Javaマルチスレッドのサンプルコード説明などを見ると、以下のようなカウンタクラス(Count)において、
カウンタの値(count)を スレッドセーフにするには、 countUp()をsyncronized宣言する。もしくは、
countUpメソッドの内部をsyncronizedブロックで囲むといった 説明がされているように思います。
public class Counter {
public static int count;
public static void countUp() {
int n = count;
何らかの処理;
count = n + 1;
}
}
たしかに、上記を1000スレッドから実行し、実行後のcountの値を参照すると、期待される結果(1000)
では無く、もっと少ない値が返されます。
同期処理の定跡に従って、countUpをsyncronized宣言すると、最終的なcountは1000になってくれるので、
それはそれで良いのですが、一方で、 加算処理をインクリメント演算子に書き換えると、syncronized
宣言するまでもなく、countは期待通りに1000になってくれます。
public class Counter {
public static int count;
public static void countUp() {
++count;
}
}
インクリメント演算子の実態は、count = count + 1 といった処理なのだと思いますが、このような1行処理であれば、
syncronizedを宣言するまでも無く、スレッドセーフになってしまうものなのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています