1

私のプログラムには、次のテンプレートの機能があります。

public MyObject myMethod() {

   final MyObject[] myObject = new MyObject[]{null};
   MyListener myListener= new MyListener() {
      public void messageReceived(MyObject newData) {
         // Thread #1
         myObject[0] = newData;
      }
   }

   ...

   // Thread #2
   while (myObject[0] == null) ;
   return myObject[0];
}

残念ながら、Java 64ビットの同期の原因に問題があります。スレッド#2はスレッド#1による変更を認識せず、whileループは終了しません。これらのスレッドをどのように同期する必要がありますか?

ありがとう!

4

3 に答える 3

1

Synchronized両方のスレッドでオブジェクトのブロックを使用できmyObjectます(nullになることはないため)。

synchronized(myObject) {
    ...do stuff ...
}

提案:whileループを使用する代わりに、wait-notifyメカニズムを使用してください。

于 2012-05-18T10:59:25.647 に答える
1

ビジーループを実行しています。これはほとんど決して良い考えではありません。代わりに、BlockingQueueなどのブロッキングデータ構造を使用してください。メッセージを受信したら、キューに入れます。そして、受信者にキューからメッセージを取得してもらいます。キューにメッセージがない間、受信者はブロックされます。

于 2012-05-18T10:45:18.627 に答える
1

Arrayの代わりにjava.util.concurrent.ArrayBlockingQueueを使用してみてください...そうすれば、synchronizedキーワードを使用する必要はありません。そのスレッドセーフ。

于 2012-05-18T10:50:48.917 に答える