java中的空检查和监听器

Add*_*dev 2 java android

我经常看到这样的代码:

Listener mListener;

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

public void fooFunction(){
   ...
   ...
   if (mListener!=null){
      mListener.notifyFoo();
   }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果在null检查和notifyFoo()之间另一个线程调用setListener(null)怎么办?那可能吗?或者编译器是否使其具有原子性

Grz*_*Żur 5

您可以同步方法

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

public synchronized void fooFunction(){
   ...
   ...
   if (mListener!=null){
       mListener.notifyFoo();
   }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要更好的锁定粒度

private Object monitor = new Object();

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

public void fooFunction(){
   ...
   ...
   synchronized (monitor) {
        if (mListener!=null){
           mListener.notifyFoo();
       }
   }
}
Run Code Online (Sandbox Code Playgroud)