プロが教える店舗&オフィスのセキュリティ対策術

Javaで複数のノード間でデータをやりとりするプログラムを書いています。

ノードは自分の持っているデータの情報を相手に渡し、その情報を元に相手は欲しいデータをこちらに要求するという形になっています。

流れとしては
相手から情報がくる>自分のもっているデータ情報と照らし合わせる>足りないデータを要求
といった感じなのですが、ここで
ほぼ同時に2つの相手から情報がくる>どちらも足りないデータで同じものをもっている
>2つの相手に同じデータを要求してしまう
という現象が起こっています。

データ要求の一連のプロセスは、情報をもらう相手ごとに別のインスタンスとして動いています。
片方がデータの要求をしている間にもう片方が自分のデータ情報を参照しないようにロックを
かければいいとは思うのですが、マルチスレッドの同期や排他制御に不慣れで
どうすればいいのかよくわかりません。
ソースがすでに膨大な量になっているためここには載せられず、わかりにくいかとは思いますが
ご助力をお願いします。

A 回答 (1件)

A, B, Cの3つのノードがあって、BとCからAに対して持っている情報が送られて来るとします。

ノードAにはBの相手をするインスタンスAbとCの相手をするインスタンスAcがあって、AbとAcは同じロジックを別のスレッドで動かしているという想定でいいですか?

1. AbがBから情報を受け取る
2. Aが持っていないデータを識別する
3. AbがBにデータを要求
4. AbがBからデータを受け取る
5. 受け取ったデータをAのデータ構造に追加する

基本的には、AbとAcの両方からアクセスできるロック用オブジェクト(lockとします)を1つ用意して上記の2~5の処理を
synchronized (lock) {
// 2~5の処理
}
のように囲んでしまえばいいです。1はsynchronizedの中に入れる必要はありません。
ただし、2~5の処理にかかる時間が長い場合にはもっと工夫しないと性能が低下する危険性があります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

いろいろとやった結果、うまく動かせることができなかったので別の方法で無理やり動かしてしまいました。
今は時間がないのでこのままいきますが、また時間があるときにご回答を参考に改良したいと思います。

お礼日時:2012/01/09 18:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!