1

Java スレッドが相互に通信しているが、明示的な同期が必要ない (実行を同期するためにオブジェクトで synchronize を呼び出す必要がない) 場合、関連するスレッド間で適切な可視性を確保するためのベスト プラクティスは何ですか?

例えば:

class B extends Thread {
     ...
     A instanceOfA = ...;

     B(){
          instanceOfA.registerHandler(new Handler(){
               @Override
               handle(SomeObjectToBeVisibile o){
                  ...
               }
          });
     }
}

class A extends Thread {
     ...
     void registerSomeHandlerMethod(HandlerMethod handler){...}

     void executeHandlers(){
          for(each registered handler){
              handler.handle(instanceOfSomeObjectToBeVisible); 
          }

     }
}

私が間違っていなければ、受信スレッドで適切な方法で表示されない可能性がある構築されたオブジェクトを渡すハンドラーの「ハンドル」メソッド呼び出しに可視性の問題が発生する可能性があります (古い値など)。はいの場合、同期を使用せずに可視性を強制する方法は?

ありがとう。

4

2 に答える 2

4

揮発性修飾子を使用できるはずですが、AtomicReferenceを使用することをお勧めします

また、不変のオブジェクトを渡す場合、コンストラクターが実行を終了する前に最終フィールドが初期化されることが保証されているため、問題はまったく発生しません。

于 2013-01-13T18:00:43.800 に答える
0

同期を恐れないでください。同期されたブロックが小さくて高速である場合、これはあなたの場合に当てはまります。ロックとロック解除は問題を引き起こしません。

ConcurrentLinkedQueue のような「ロックフリー」の同時データ構造を使用できます。(あなたのケースではそれほど速くはなりません)

handle()EDIT:ハンドラー自体ではなく、に渡される引数の可視性について心配しているようです。

于 2013-01-13T18:22:42.947 に答える