- PR -

マルチスレッドプログラミングに関して

投稿者投稿内容
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2005-03-23 14:11
インギさん

>問題ないように見えますね。
>「同時に実行されてしまう」のはどのようにして確認していますか?

処理の途中でログファイルに書き出して確認しています。
きちんと同期が取れていれば2つ同時に実行しても最初の処理でログを書き、その後
次の処理でログを書くはずです。
現状は2つの処理で同時にログファイルへ書き込んでいます(2つ同時に動いているから)
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-03-23 14:28
ロガーの実装が非同期で動いている可能性はないでしょうか。
っていっても、なさそうな気がしますが。。。

試しに、ログとコンソールに時間とスレッド名を出してみてください。
HogeLogger.trace(System.currentTimeMillis() + ":" + Thread.currentThread().getName());
System.out.println(System.currentTimeMillis() + ":" + Thread.currentThread().getName());

出力される順番もログとコンソールで一緒ですか?
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2005-03-23 16:18
かつのりさん、インギさんいろいろとご教授ありがとうございます。
今回の件ですが私のミスで同期が取れておりませんでした。
jarファイルのmainにsynchronizedを指定してビルドしたのですが
Webのアプリのほうからは古いjarファイル(synchronizedを指定する前)を使ってテストを行っておりました。
synchronizedを指定したjarファイルのプログラムでは複数の端末から同時実行しても
順番に動作することを確認いたしました。
まことに申し訳ございませんでした....
今後ともよろしくお願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-23 16:33
お疲れ様です。解決したとのことで何よりです。
一度思いこんでしまうとなにかと切りわけが難しくなってしまいますよね。

迷ったら一度 「再現可能な最小限のアプリケーション」を作ってみることをお勧めします。
コマンドラインをたたいて main メソッドから実行するようなタイプのモノです。
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2005-04-01 10:59
インギさんへ
今回の件はOKになったのですが、以前にインギさんからご指摘のありましたことで教えてほしいことがございます

>サーブレットなどを使って同一の JVM(一つのjavaプロセス内)で同時に実行するのであれば
>synchronized されたメソッドは同期されます。ただし、この場合同期はインスタンス毎に行われま
>すので毎回 Hoge1 クラスのインスタンスを生成していたのでは複数同時に実行されることになりま
>す。


前述のjarファイルプログラム(Hoge1)をsynchronizedせずサーブレットから複数スレッドで実行された場合
ですが(2つのスレッドが実行されスレッド1、スレッド2とします)
Hoge1内である変数(hensu1とします)を設定していた場合

スレッド1で設定したhensu1がスレッド2で上書きされてしまうのでしょうか?
すなわち、スレッド1が自分で設定したhensu1を利用しようとしたら実はスレッド2で上書きされていて
内容が書き換わっていると言うことです。
(こちらでテストした限りでは上書きされています)

複数スレッドでhoge1を実行した場合hensu1は同じメモリ空間の領域(ヒープ領域)で同じアドレスをさして
いるのでしょうか?

素人な質問で申し訳ございませんが、よろしくご教授お願いいたします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-04-01 11:17
Hoge1 の main メソッドは synchronized なので複数スレッドから呼び出しても競合状態になることはありません。
ただし static な変数の読み書きはメソッド実行に同期をとっているかどうかに関わらずどのスレッドからの呼び出しでも値は共有されます。
スレッド毎に別の値をもちたいのであればインスタンス化して、変数もインスタンス変数とすれば良いです。

スキルアップ/キャリアアップ(JOB@IT)