2

次のようなコードをよく見かけます。

Listener mListener;

public void setListener(Listener listener){
   mListener=listener;
}

public void fooFunction(){
   ...
   ...
   if (mListener!=null){
      mListener.notifyFoo();
   }
}

私の質問は次のとおりです。null チェックと notifyFoo() の間で別のスレッドが setListener(null) を呼び出した場合はどうなりますか? それは可能ですか?またはコンパイラはそれをアトミックにしますか

4

5 に答える 5

1

ブロックを同期化することでそれを回避できます

public synchronized void setListener(Listener listener) {
    ....
}

public synchronized void fooFunction() {
    ....
}
于 2013-06-27T09:19:35.510 に答える
0

ここでの同期はやり過ぎです。チェックする前に、メンバー変数のコピーを取得するだけですnull

Listener mListener;

public void setListener(Listener listener){
   mListener=listener;
}

public void fooFunction(){
   ...
   ...
   Listener listener = mListener;
   if (listener!=null){
      listener.notifyFoo();
   }
}
于 2013-06-27T09:35:08.850 に答える